Search in sources :

Example 1 with NameTable

use of com.google.devtools.j2objc.util.NameTable in project j2objc by google.

the class AnonymousClassConverterTest method testMethodVarInAnonymousClass.

public void testMethodVarInAnonymousClass() throws IOException {
    String source = "class Test { " + "  boolean debug;" + "  void foo() { " + "    if (true) {" + "      if (debug) {" + "        final Integer i = 1;" + "        Runnable r = new Runnable() { " + "          public void run() { int j = i + 1; } }; }}}}";
    // Verify method var in r1.run() isn't mistakenly made a field in r1.
    CompilationUnit unit = translateType("Test", source);
    NameTable nameTable = unit.getEnv().nameTable();
    List<AbstractTypeDeclaration> types = unit.getTypes();
    AbstractTypeDeclaration r1 = types.get(1);
    assertEquals("Test_1", nameTable.getFullName(r1.getTypeElement()));
    boolean found = false;
    for (VariableDeclarationFragment var : TreeUtil.getAllFields(r1)) {
        if (ElementUtil.getName(var.getVariableElement()).equals("val$i")) {
            found = true;
        }
    }
    assertTrue("required field not found", found);
    // Verify method var is passed to constructor.
    String translation = generateFromUnit(unit, "Test.m");
    assertTranslation(translation, "r = create_Test_1_initWithJavaLangInteger_(i)");
}
Also used : CompilationUnit(com.google.devtools.j2objc.ast.CompilationUnit) VariableDeclarationFragment(com.google.devtools.j2objc.ast.VariableDeclarationFragment) NameTable(com.google.devtools.j2objc.util.NameTable) AbstractTypeDeclaration(com.google.devtools.j2objc.ast.AbstractTypeDeclaration)

Example 2 with NameTable

use of com.google.devtools.j2objc.util.NameTable in project j2objc by google.

the class GeneratedType method fromTypeDeclaration.

public static GeneratedType fromTypeDeclaration(AbstractTypeDeclaration typeNode) {
    TypeElement typeElement = typeNode.getTypeElement();
    CompilationUnit unit = TreeUtil.getCompilationUnit(typeNode);
    NameTable nameTable = unit.getEnv().nameTable();
    boolean emitLineDirectives = unit.getEnv().options().emitLineDirectives();
    ImmutableList.Builder<String> superTypes = ImmutableList.builder();
    TypeElement superclass = ElementUtil.getSuperclass(typeElement);
    if (superclass != null) {
        superTypes.add(nameTable.getFullName(superclass));
    }
    for (TypeElement superInterface : ElementUtil.getInterfaces(typeElement)) {
        superTypes.add(nameTable.getFullName(superInterface));
    }
    HeaderImportCollector headerCollector = new HeaderImportCollector(unit, HeaderImportCollector.Filter.PUBLIC_ONLY);
    typeNode.accept(headerCollector);
    HeaderImportCollector privateDeclarationCollector = new HeaderImportCollector(unit, HeaderImportCollector.Filter.PRIVATE_ONLY);
    typeNode.accept(privateDeclarationCollector);
    ImplementationImportCollector importCollector = new ImplementationImportCollector(unit);
    typeNode.accept(importCollector);
    SourceBuilder builder = new SourceBuilder(emitLineDirectives);
    GeneratedSourceMappings generatedSourceMappings = new GeneratedSourceMappings();
    TypeDeclarationGenerator.generate(builder, typeNode, generatedSourceMappings);
    String publicDeclarationCode = builder.toString();
    builder = new SourceBuilder(emitLineDirectives);
    TypePrivateDeclarationGenerator.generate(builder, typeNode);
    String privateDeclarationCode;
    String implementationCode;
    Options options = unit.getEnv().options();
    if (unit.getEnv().translationUtil().generateImplementation(typeElement)) {
        builder = new SourceBuilder(options.emitLineDirectives());
        TypePrivateDeclarationGenerator.generate(builder, typeNode);
        privateDeclarationCode = builder.toString();
        builder = new SourceBuilder(options.emitLineDirectives());
        TypeImplementationGenerator.generate(builder, typeNode);
        implementationCode = builder.toString();
    } else {
        privateDeclarationCode = "";
        implementationCode = String.format("// Implementation not generated because %s is on the bootclasspath.\n", ElementUtil.getQualifiedName(typeElement));
    }
    ImmutableSet.Builder<Import> implementationIncludes = ImmutableSet.builder();
    implementationIncludes.addAll(privateDeclarationCollector.getSuperTypes());
    implementationIncludes.addAll(importCollector.getImports());
    return new GeneratedType(nameTable.getFullName(typeElement), typeNode.hasPrivateDeclaration(), superTypes.build(), ImmutableSet.copyOf(headerCollector.getForwardDeclarations()), ImmutableSet.copyOf(headerCollector.getSuperTypes()), ImmutableSet.copyOf(privateDeclarationCollector.getForwardDeclarations()), implementationIncludes.build(), publicDeclarationCode, privateDeclarationCode, implementationCode, generatedSourceMappings);
}
Also used : CompilationUnit(com.google.devtools.j2objc.ast.CompilationUnit) Options(com.google.devtools.j2objc.Options) Import(com.google.devtools.j2objc.types.Import) TypeElement(javax.lang.model.element.TypeElement) ImmutableList(com.google.common.collect.ImmutableList) HeaderImportCollector(com.google.devtools.j2objc.types.HeaderImportCollector) ImplementationImportCollector(com.google.devtools.j2objc.types.ImplementationImportCollector) ImmutableSet(com.google.common.collect.ImmutableSet) NameTable(com.google.devtools.j2objc.util.NameTable)

Example 3 with NameTable

use of com.google.devtools.j2objc.util.NameTable in project j2objc by google.

the class AnonymousClassConverterTest method testMethodVarInSwitch.

public void testMethodVarInSwitch() throws IOException {
    String source = "class Test { " + "  enum E { ONE, TWO };" + "  void foo(E e) { " + "    switch (e) {" + "      case ONE: {" + "        final Integer i = 1;" + "        Runnable r = new Runnable() { " + "          public void run() { int j = i + 1; } }; }}}}";
    // Verify method var in r1.run() isn't mistakenly made a field in r1.
    CompilationUnit unit = translateType("Test", source);
    NameTable nameTable = unit.getEnv().nameTable();
    List<AbstractTypeDeclaration> types = unit.getTypes();
    AbstractTypeDeclaration r1 = types.get(2);
    assertEquals("Test_1", nameTable.getFullName(r1.getTypeElement()));
    boolean found = false;
    for (VariableDeclarationFragment var : TreeUtil.getAllFields(r1)) {
        if (ElementUtil.getName(var.getVariableElement()).equals("val$i")) {
            found = true;
        }
    }
    assertTrue("required field not found", found);
    // Verify method var is passed to constructor.
    String translation = generateFromUnit(unit, "Test.m");
    assertTranslation(translation, "r = create_Test_1_initWithJavaLangInteger_(i)");
}
Also used : CompilationUnit(com.google.devtools.j2objc.ast.CompilationUnit) VariableDeclarationFragment(com.google.devtools.j2objc.ast.VariableDeclarationFragment) NameTable(com.google.devtools.j2objc.util.NameTable) AbstractTypeDeclaration(com.google.devtools.j2objc.ast.AbstractTypeDeclaration)

Example 4 with NameTable

use of com.google.devtools.j2objc.util.NameTable in project j2objc by google.

the class AnonymousClassConverterTest method testMethodVarInNestedAnonymousClass.

public void testMethodVarInNestedAnonymousClass() throws IOException {
    String source = "class Test { " + "  void bar() { " + "    Runnable r1 = new Runnable() { " + "      public void run() { " + "        final Integer i = 1; " + "        Runnable r2 = new Runnable() { " + "          public void run() { int j = i + 1; } }; } }; } }";
    // Verify method var in r1.run() isn't mistakenly made a field in r1.
    CompilationUnit unit = translateType("Test", source);
    NameTable nameTable = unit.getEnv().nameTable();
    List<AbstractTypeDeclaration> types = unit.getTypes();
    AbstractTypeDeclaration r1 = types.get(1);
    assertEquals("Test_1", nameTable.getFullName(r1.getTypeElement()));
    for (VariableDeclarationFragment var : TreeUtil.getAllFields(r1)) {
        if (ElementUtil.getName(var.getVariableElement()).equals("val$i")) {
            fail("found field that shouldn't be declared");
        }
    }
    // Method var in r1.run() becomes a field in r2.
    AbstractTypeDeclaration r2 = types.get(2);
    assertEquals("Test_1_1", nameTable.getFullName(r2.getTypeElement()));
    boolean found = false;
    for (VariableDeclarationFragment var : TreeUtil.getAllFields(r2)) {
        if (ElementUtil.getName(var.getVariableElement()).equals("val$i")) {
            found = true;
        }
    }
    assertTrue("required field not found", found);
    // Verify constructor takes both outer field and var.
    String translation = generateFromUnit(unit, "Test.m");
    assertTranslation(translation, "r2 = create_Test_1_1_initWithJavaLangInteger_(i)");
}
Also used : CompilationUnit(com.google.devtools.j2objc.ast.CompilationUnit) VariableDeclarationFragment(com.google.devtools.j2objc.ast.VariableDeclarationFragment) NameTable(com.google.devtools.j2objc.util.NameTable) AbstractTypeDeclaration(com.google.devtools.j2objc.ast.AbstractTypeDeclaration)

Aggregations

CompilationUnit (com.google.devtools.j2objc.ast.CompilationUnit)4 NameTable (com.google.devtools.j2objc.util.NameTable)4 AbstractTypeDeclaration (com.google.devtools.j2objc.ast.AbstractTypeDeclaration)3 VariableDeclarationFragment (com.google.devtools.j2objc.ast.VariableDeclarationFragment)3 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableSet (com.google.common.collect.ImmutableSet)1 Options (com.google.devtools.j2objc.Options)1 HeaderImportCollector (com.google.devtools.j2objc.types.HeaderImportCollector)1 ImplementationImportCollector (com.google.devtools.j2objc.types.ImplementationImportCollector)1 Import (com.google.devtools.j2objc.types.Import)1 TypeElement (javax.lang.model.element.TypeElement)1