diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCHeaderGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCHeaderGenerator.java index d35466eff4..85baeaa8f0 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCHeaderGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCHeaderGenerator.java @@ -107,9 +107,9 @@ protected Set generateFileHeader() { pushIgnoreDeprecatedDeclarationsPragma(); pushIgnoreNullabilityPragmas(); - Set seenTypes = Sets.newHashSet(); + Set seenTypes = Sets.newLinkedHashSet(); Set includeFiles = Sets.newTreeSet(); - Set forwardDeclarations = Sets.newHashSet(); + Set forwardDeclarations = Sets.newLinkedHashSet(); includeFiles.add("J2ObjC_header.h"); diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java index a90e434e0c..07830d6046 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java @@ -149,8 +149,8 @@ private void printImports() { print(code); } - Set seenTypes = Sets.newHashSet(); - Set forwardDecls = Sets.newHashSet(); + Set seenTypes = Sets.newLinkedHashSet(); + Set forwardDecls = Sets.newLinkedHashSet(); for (GeneratedType generatedType : getOrderedTypes()) { String name = generatedType.getTypeName(); seenTypes.add(name); diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java index 92d8debeb2..5c7ae339b4 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java @@ -90,11 +90,21 @@ private String getSourceFilePath() { Path sourceFilePath = toNormalizedSourcePath(sourceFilePathString); Path cwdPath = toNormalizedSourcePath("."); - if (!sourceFilePath.startsWith(cwdPath)) { - return sourceFilePathString; + if (sourceFilePath.startsWith(cwdPath)) { + return cwdPath.relativize(sourceFilePath).toString(); + } + + Path tempDir = + Paths.get(System.getProperty("java.io.tmpdir", "/tmp")).normalize().toAbsolutePath(); + if (sourceFilePath.startsWith(tempDir)) { + Path relativeToTemp = tempDir.relativize(sourceFilePath); + if (relativeToTemp.getNameCount() > 1) { + return relativeToTemp.subpath(1, relativeToTemp.getNameCount()).toString(); + } + return relativeToTemp.toString(); } - return cwdPath.relativize(sourceFilePath).toString(); + return sourceFilePathString; } protected void generate() { diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/VariableRenamer.java b/translator/src/main/java/com/google/devtools/j2objc/translate/VariableRenamer.java index 3b1bef3c1a..b90d8a454b 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/VariableRenamer.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/VariableRenamer.java @@ -36,7 +36,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.util.ArrayDeque; import java.util.Deque; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -52,15 +52,15 @@ public class VariableRenamer extends UnitTreeVisitor { private final Deque> fieldNameStack = new ArrayDeque<>(); - private final Set renamedTypes = new HashSet<>(); + private final Set renamedTypes = new LinkedHashSet<>(); // Keep track of the variables and names in a scope so we can rename variables in a // scope-aware manner; start with a sentinel empty scope. private final Deque scopes = new ArrayDeque<>(ImmutableList.of(new Scope())); // Keep track of variables that are in scope and the names that have already been used. private static class Scope { - private final Set variables = new HashSet<>(); - private final Set usedNames = new HashSet<>(); + private final Set variables = new LinkedHashSet<>(); + private final Set usedNames = new LinkedHashSet<>(); private Scope(Scope enclosingScope) { this.variables.addAll(enclosingScope.variables); @@ -94,12 +94,12 @@ private void collectAndRenameFields(TypeElement type, Set field collectAndRenameFields(ElementUtil.getSuperclass(type), fields); if (!renamedTypes.contains(type)) { renamedTypes.add(type); - Set superFieldNames = new HashSet<>(); + Set superFieldNames = new LinkedHashSet<>(); for (VariableElement superField : fields) { superFieldNames.add(superField.getSimpleName().toString()); } // Look for methods that might conflict with a static variable when functionized. - Set staticMethodNames = new HashSet<>(); + Set staticMethodNames = new LinkedHashSet<>(); for (ExecutableElement method : ElementUtil.getExecutables(type)) { if (method.getParameters().size() == 0) { staticMethodNames.add(nameTable.getFunctionName(method)); @@ -135,9 +135,9 @@ private void collectAndRenameFields(TypeElement type, Set field } private void pushType(TypeElement type) { - Set fields = new HashSet<>(); + Set fields = new LinkedHashSet<>(); collectAndRenameFields(type, fields); - Set fullFieldNames = new HashSet<>(); + Set fullFieldNames = new LinkedHashSet<>(); for (VariableElement field : fields) { fullFieldNames.add(nameTable.getVariableShortName(field)); } @@ -173,7 +173,8 @@ public void endVisit(SimpleName node) { } if (var.getKind().isField()) { // Make sure fields for the declaring type are renamed. - collectAndRenameFields(ElementUtil.getDeclaringClass(var), new HashSet()); + collectAndRenameFields( + ElementUtil.getDeclaringClass(var), new LinkedHashSet()); } else { // Local variable or parameter. handleVariable(var); diff --git a/translator/src/main/java/com/google/devtools/j2objc/types/HeaderImportCollector.java b/translator/src/main/java/com/google/devtools/j2objc/types/HeaderImportCollector.java index 78072b1e19..e5cf56f7a9 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/types/HeaderImportCollector.java +++ b/translator/src/main/java/com/google/devtools/j2objc/types/HeaderImportCollector.java @@ -34,7 +34,6 @@ import com.google.devtools.j2objc.util.ElementUtil; import com.google.devtools.j2objc.util.TranslationUtil; import com.google.devtools.j2objc.util.TypeUtil; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import javax.lang.model.element.Element; @@ -80,7 +79,7 @@ private boolean include(BodyDeclaration node) { // Supertypes of the below declared types that haven't been seen by this collector. private Set superTypes = new LinkedHashSet<>(); // Declared types seen by this collector. - private Set declaredTypes = new HashSet<>(); + private Set declaredTypes = new LinkedHashSet<>(); // The current type declarations is annotated for ObjC generics. private boolean wantsGenerateObjectiveCGenerics = false; private final boolean includeInnerTypes; @@ -152,10 +151,10 @@ public boolean visit(FieldDeclaration node) { private Set objCForwardDeclaredGenericParameters(TypeMirror type) { // Parameters only needed with ObjC generics are on. if (!unit.getEnv().options().asObjCGenericDecl() && !wantsGenerateObjectiveCGenerics) { - return new HashSet<>(); + return new LinkedHashSet<>(); } - HashSet vistedTypes = new HashSet<>(); + Set vistedTypes = new LinkedHashSet<>(); vistedTypes.add(type); for (TypeElement bound : unit.getEnv().typeUtil().getObjcUpperBounds(type)) { vistedTypes.add(bound.asType());