diff --git a/.idea/libraries/dx_android.xml b/.idea/libraries/dx_android.xml new file mode 100644 index 00000000000..fc5f4ca13aa --- /dev/null +++ b/.idea/libraries/dx_android.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/compiler/tests/compiler-tests.iml b/compiler/tests/compiler-tests.iml index d3c95e7a65d..c20ff6b17a1 100644 --- a/compiler/tests/compiler-tests.iml +++ b/compiler/tests/compiler-tests.iml @@ -14,6 +14,7 @@ + diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index 2d2fe3b8b9a..a2e49b517e7 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -184,6 +184,11 @@ public abstract class CodegenTestCase extends UsefulTestCase { protected void blackBox() { GenerationState state = generateClassesInFileGetState(); + + if (DxChecker.RUN_DX_CHECKER) { + DxChecker.check(state.getFactory()); + } + GeneratedClassLoader loader = createClassLoader(state.getFactory()); String r; @@ -224,7 +229,7 @@ public abstract class CodegenTestCase extends UsefulTestCase { r = (String) method.invoke(null); assertEquals("OK", r); } - } catch (NoClassDefFoundError e) { + } catch (Error e) { System.out.println(generateToText()); throw e; } catch (Throwable e) { @@ -268,6 +273,11 @@ public abstract class CodegenTestCase extends UsefulTestCase { protected Class generateNamespaceClass() { ClassFileFactory state = generateClassesInFile(); + + if (DxChecker.RUN_DX_CHECKER) { + DxChecker.check(state); + } + return loadRootNamespaceClass(state); } @@ -299,6 +309,11 @@ public abstract class CodegenTestCase extends UsefulTestCase { @NotNull protected ClassFileFactory generateClassesInFile() { GenerationState generationState = generateClassesInFileGetState(); + + if (DxChecker.RUN_DX_CHECKER) { + DxChecker.check(generationState.getFactory()); + } + return generationState.getFactory(); } diff --git a/compiler/tests/org/jetbrains/jet/codegen/DxChecker.java b/compiler/tests/org/jetbrains/jet/codegen/DxChecker.java new file mode 100644 index 00000000000..c37ea880abb --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/codegen/DxChecker.java @@ -0,0 +1,69 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.codegen; + +import com.android.dx.command.dexer.Main; +import com.android.dx.dex.cf.CfTranslator; +import junit.framework.Assert; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Natalia.Ukhorskaya + */ + +public class DxChecker { + + public static final boolean RUN_DX_CHECKER = true; + private static final Pattern STACK_TRACE_PATTERN = Pattern.compile("[\\s]+at .*"); + + private DxChecker() { + } + + public static void check(ClassFileFactory factory) { + Main.Arguments arguments = new Main.Arguments(); + String[] array = new String[1]; + array[0] = "testArgs"; + arguments.parse(array); + + for (String file : factory.files()) { + try { + CfTranslator.translate(file, factory.asBytes(file), arguments.cfOptions, arguments.dexOptions); + } + catch (Throwable e) { + Assert.fail(generateExceptionMessage(e)); + } + } + } + + private static String generateExceptionMessage(Throwable e) { + StringWriter writer = new StringWriter(); + PrintWriter printWriter = new PrintWriter(writer); + try { + e.printStackTrace(printWriter); + String stackTrace = writer.toString(); + Matcher matcher = STACK_TRACE_PATTERN.matcher(stackTrace); + return matcher.replaceAll(""); + } + finally { + printWriter.close(); + } + } +} diff --git a/update_dependencies.xml b/update_dependencies.xml index 6f93ceffbb6..a92ac8769f9 100644 --- a/update_dependencies.xml +++ b/update_dependencies.xml @@ -59,6 +59,10 @@ + + + +