Skip to content

Commit

Permalink
2.1 midway
Browse files Browse the repository at this point in the history
  • Loading branch information
elucash committed Aug 14, 2015
1 parent cbeacaf commit 3a460d6
Show file tree
Hide file tree
Showing 22 changed files with 1,926 additions and 138 deletions.
Expand Up @@ -13,23 +13,19 @@
import org.immutables.generator.processor.ImmutableTrees.AccessExpression; import org.immutables.generator.processor.ImmutableTrees.AccessExpression;
import org.immutables.generator.processor.ImmutableTrees.AssignGenerator; import org.immutables.generator.processor.ImmutableTrees.AssignGenerator;
import org.immutables.generator.processor.ImmutableTrees.ForStatement; import org.immutables.generator.processor.ImmutableTrees.ForStatement;
import org.immutables.generator.processor.ImmutableTrees.Identifier;
import org.immutables.generator.processor.ImmutableTrees.InvokableDeclaration; import org.immutables.generator.processor.ImmutableTrees.InvokableDeclaration;
import org.immutables.generator.processor.ImmutableTrees.InvokeStatement; import org.immutables.generator.processor.ImmutableTrees.InvokeStatement;
import org.immutables.generator.processor.ImmutableTrees.LetStatement; import org.immutables.generator.processor.ImmutableTrees.LetStatement;
import org.immutables.generator.processor.ImmutableTrees.Template; import org.immutables.generator.processor.ImmutableTrees.Template;
import org.immutables.generator.processor.ImmutableTrees.TextLine; import org.immutables.generator.processor.ImmutableTrees.TextLine;
import org.immutables.generator.processor.ImmutableTrees.Unit; import org.immutables.generator.processor.ImmutableTrees.Unit;
import org.immutables.generator.processor.ImmutableTrees.ValueDeclaration; import org.immutables.generator.processor.ImmutableTrees.ValueDeclaration;
import org.immutables.generator.processor.Trees.Expression;
import org.immutables.generator.processor.Trees.Identifier;
import org.immutables.generator.processor.Trees.Parameter;
import org.immutables.generator.processor.Trees.TemplatePart;
import org.immutables.generator.processor.Trees.UnitPart;


final class Inliner { final class Inliner {
private Inliner() {} private Inliner() {}


private final Map<Identifier, InlinedStatementCreator> inlinables = Maps.newHashMap(); private final Map<Trees.Identifier, InlinedStatementCreator> inlinables = Maps.newHashMap();


public static Unit optimize(Unit unit) { public static Unit optimize(Unit unit) {
return new Inliner().inline(unit); return new Inliner().inline(unit);
Expand All @@ -43,25 +39,25 @@ private Unit inline(Unit unit) {
private static class InlinedStatementCreator extends TreesTransformer<Void> { private static class InlinedStatementCreator extends TreesTransformer<Void> {
private final Template inlinable; private final Template inlinable;
private final int uniqueSuffix; private final int uniqueSuffix;
private final Set<Identifier> remapped = Sets.newHashSet(); private final Set<Trees.Identifier> remapped = Sets.newHashSet();


InlinedStatementCreator(Template inlinable) { InlinedStatementCreator(Template inlinable) {
this.uniqueSuffix = System.identityHashCode(inlinable); this.uniqueSuffix = System.identityHashCode(inlinable);
this.inlinable = inlinable; this.inlinable = inlinable;
for (Parameter p : inlinable.declaration().parameters()) { for (Trees.Parameter p : inlinable.declaration().parameters()) {
remapped.add(p.name()); remapped.add(p.name());
} }
} }


ForStatement inlined(List<Expression> params, Iterable<? extends TemplatePart> bodyParts) { ForStatement inlined(List<Trees.Expression> params, Iterable<? extends Trees.TemplatePart> bodyParts) {
ForStatement.Builder builder = ForStatement.builder() ForStatement.Builder builder = ForStatement.builder()
.useForAccess(false) .useForAccess(false)
.useDelimit(false); .useDelimit(false);


Iterator<Parameter> formals = inlinable.declaration().parameters().iterator(); Iterator<Trees.Parameter> formals = inlinable.declaration().parameters().iterator();


for (Expression argument : params) { for (Trees.Expression argument : params) {
Parameter formal = formals.next(); Trees.Parameter formal = formals.next();


builder.addDeclaration( builder.addDeclaration(
AssignGenerator.builder() AssignGenerator.builder()
Expand All @@ -77,7 +73,7 @@ ForStatement inlined(List<Expression> params, Iterable<? extends TemplatePart> b
return builder.build(); return builder.build();
} }


private ValueDeclaration declarationFor(Parameter formalParameter) { private ValueDeclaration declarationFor(Trees.Parameter formalParameter) {
return ValueDeclaration.builder() return ValueDeclaration.builder()
.type(formalParameter.type()) .type(formalParameter.type())
.name(remappedIdentifier(formalParameter.name())) .name(remappedIdentifier(formalParameter.name()))
Expand All @@ -86,16 +82,16 @@ private ValueDeclaration declarationFor(Parameter formalParameter) {


private void addBodyIfNecessary( private void addBodyIfNecessary(
ForStatement.Builder builder, ForStatement.Builder builder,
List<Expression> params, List<Trees.Expression> params,
Iterable<? extends TemplatePart> bodyParts) { Iterable<? extends Trees.TemplatePart> bodyParts) {
// body goes as one special parameter, don't handle other mismatches // body goes as one special parameter, don't handle other mismatches
if (Iterables.isEmpty(bodyParts)) { if (Iterables.isEmpty(bodyParts)) {
return; return;
} }


Preconditions.checkState(inlinable.declaration().parameters().size() == params.size() + 1); Preconditions.checkState(inlinable.declaration().parameters().size() == params.size() + 1);


Parameter lastParameter = Iterables.getLast(inlinable.declaration().parameters()); Trees.Parameter lastParameter = Iterables.getLast(inlinable.declaration().parameters());


LetStatement.Builder letBuilder = LetStatement.builder() LetStatement.Builder letBuilder = LetStatement.builder()
.addAllParts(bodyParts) .addAllParts(bodyParts)
Expand All @@ -109,11 +105,11 @@ private void addBodyIfNecessary(


@Override @Override
public AccessExpression transform(Void context, AccessExpression value) { public AccessExpression transform(Void context, AccessExpression value) {
final Identifier topAccessIdentifier = value.path().get(0); final Trees.Identifier topAccessIdentifier = value.path().get(0);
if (remapped.contains(topAccessIdentifier)) { if (remapped.contains(topAccessIdentifier)) {
return new TreesTransformer<Void>() { return new TreesTransformer<Void>() {
@Override @Override
public ImmutableTrees.Identifier transform(Void context, ImmutableTrees.Identifier value) { public Identifier transform(Void context, Identifier value) {
return topAccessIdentifier == value return topAccessIdentifier == value
? remappedIdentifier(value) ? remappedIdentifier(value)
: value; : value;
Expand All @@ -123,34 +119,49 @@ public ImmutableTrees.Identifier transform(Void context, ImmutableTrees.Identifi
return value; return value;
} }


protected ImmutableTrees.Identifier remappedIdentifier(Trees.Identifier value) { protected Identifier remappedIdentifier(Trees.Identifier value) {
return ImmutableTrees.Identifier.of(value.value() + "_" + uniqueSuffix); return Identifier.of(
value.value()
+ "_" + inlinable.declaration().name().value()
+ "_" + uniqueSuffix);
} }
} }


final class Finder extends TreesTransformer<Void> { final class Finder extends TreesTransformer<Void> {
private boolean containsNewlines; private boolean inlinable;


@Override @Override
public Template transform(Void context, Template value) { public Template transform(Void context, Template value) {
if (value.isPublic()) { if (value.isPublic()) {
return value; return value;
} }


containsNewlines = false; inlinable = true;


super.transform(context, value); transformTemplateListParts(context, value, value.parts());


if (!containsNewlines) { if (inlinable) {
inlinables.put(value.declaration().name(), new InlinedStatementCreator(value)); inlinables.put(value.declaration().name(), new InlinedStatementCreator(value));
} }
return value; return value;
} }


@Override
public InvokableDeclaration transform(Void context, InvokableDeclaration value) {
inlinable = false;
return value;
}

@Override
public ValueDeclaration transform(Void context, ValueDeclaration value) {
inlinable = false;
return value;
}

@Override @Override
public TextLine transform(Void context, TextLine value) { public TextLine transform(Void context, TextLine value) {
if (value.newline()) { if (value.newline()) {
containsNewlines = true; inlinable = false;
} }
return value; return value;
} }
Expand All @@ -159,16 +170,16 @@ public TextLine transform(Void context, TextLine value) {
final class Weaver extends TreesTransformer<Void> { final class Weaver extends TreesTransformer<Void> {


@Override @Override
protected Iterable<UnitPart> transformUnitListParts(Void context, Unit value, List<UnitPart> parts) { protected Iterable<Trees.UnitPart> transformUnitListParts(Void context, Unit value, List<Trees.UnitPart> parts) {
// TODO decide if we need to remove inlined completely // TODO decide if we need to remove inlined completely
// could be referenced by outer templates // could be referenced by outer templates
// return super.transformUnitListParts(context, value, parts); // return super.transformUnitListParts(context, value, parts);
return super.transformUnitListParts(context, value, inlinedRemoved(parts)); return super.transformUnitListParts(context, value, inlinedRemoved(parts));
} }


private List<UnitPart> inlinedRemoved(List<UnitPart> parts) { private List<Trees.UnitPart> inlinedRemoved(List<Trees.UnitPart> parts) {
List<UnitPart> newParts = Lists.newArrayListWithCapacity(parts.size()); List<Trees.UnitPart> newParts = Lists.newArrayListWithCapacity(parts.size());
for (UnitPart p : parts) { for (Trees.UnitPart p : parts) {
if (!inlinables.containsKey(p)) { if (!inlinables.containsKey(p)) {
newParts.add(p); newParts.add(p);
} }
Expand All @@ -177,21 +188,20 @@ private List<UnitPart> inlinedRemoved(List<UnitPart> parts) {
} }


@Override @Override
protected TemplatePart transformTemplatePart(Void context, InvokeStatement value) { protected Trees.TemplatePart transformTemplatePart(Void context, InvokeStatement value) {
@Nullable @Nullable InlinedStatementCreator creator = tryGetInlinable(value);
InlinedStatementCreator creator = tryGetInlinable(value);
if (creator != null) { if (creator != null) {
return creator.inlined(value.params(), value.parts()); return creator.inlined(value.params(), value.parts());
} }
return value; return value;
} }


private @Nullable InlinedStatementCreator tryGetInlinable(InvokeStatement invoke) { private @Nullable InlinedStatementCreator tryGetInlinable(InvokeStatement invoke) {
Expression access = invoke.access(); Trees.Expression access = invoke.access();
if (access instanceof AccessExpression) { if (access instanceof AccessExpression) {
AccessExpression ref = (AccessExpression) access; AccessExpression ref = (AccessExpression) access;
if (ref.path().size() == 1) { if (ref.path().size() == 1) {
Identifier identifier = ref.path().get(0); Trees.Identifier identifier = ref.path().get(0);
return inlinables.get(identifier); return inlinables.get(identifier);
} }
} }
Expand Down
Expand Up @@ -351,6 +351,12 @@ public boolean isEmpty() {
public boolean newline() { public boolean newline() {
return false; return false;
} }
}


@Override
public String toString() {
return StringLiterals.toLiteral(
fragment().value()
+ (newline() ? "\n" : ""));
}
}
} }
24 changes: 14 additions & 10 deletions generator/src/org/immutables/generator/PostprocessingMachine.java
Expand Up @@ -17,7 +17,6 @@


import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
Expand Down Expand Up @@ -74,8 +73,7 @@ private static CharSequence rewrite(CharSequence content, ImportsBuilder imports
QualifiedNameMachine importsQualifiedNameMachine = new QualifiedNameMachine().allowNestedTypes(); QualifiedNameMachine importsQualifiedNameMachine = new QualifiedNameMachine().allowNestedTypes();
CommentMachine commentMachine = new CommentMachine(); CommentMachine commentMachine = new CommentMachine();
ClassNameMachine nameMachine = new ClassNameMachine(); ClassNameMachine nameMachine = new ClassNameMachine();
@Nullable @Nullable CharSequence header = null;
CharSequence header = null;


for (int i = 0; i < content.length(); i++) { for (int i = 0; i < content.length(); i++) {
char c = content.charAt(i); char c = content.charAt(i);
Expand Down Expand Up @@ -355,15 +353,15 @@ static final class ImportsBuilder {


private final TreeSet<String> imports = Sets.newTreeSet(); private final TreeSet<String> imports = Sets.newTreeSet();
private final HashMap<String, String> originalImports = Maps.newHashMap(); private final HashMap<String, String> originalImports = Maps.newHashMap();
private Optional<String> currentPackage = Optional.absent();
private final Multimap<String, ImportCandidate> importCandidates = HashMultimap.create(); private final Multimap<String, ImportCandidate> importCandidates = HashMultimap.create();
private final HashMap<String, String> nameToQualified = Maps.newHashMap(); private final HashMap<String, String> nameToQualified = Maps.newHashMap();
private final HashSet<String> exceptions = Sets.newHashSet(); private final HashSet<String> exceptions = Sets.newHashSet();
private final HashSet<String> stopList = Sets.newHashSet(); private final HashSet<String> stopList = Sets.newHashSet();


private String currentPackagePrefix = "";

void addImportCandidate(String name, String qualifiedName, int importFrom, int importTo, int packageTo) { void addImportCandidate(String name, String qualifiedName, int importFrom, int importTo, int packageTo) {
@Nullable @Nullable String foundQualified = nameToQualified.get(name);
String foundQualified = nameToQualified.get(name);
if (foundQualified != null && !foundQualified.equals(qualifiedName)) { if (foundQualified != null && !foundQualified.equals(qualifiedName)) {
return; return;
} }
Expand Down Expand Up @@ -392,7 +390,7 @@ private boolean omittedImport(String name, String qualifiedName) {
if ((JAVA_LANG + name).equals(qualifiedName)) { if ((JAVA_LANG + name).equals(qualifiedName)) {
return true; return true;
} }
if (currentPackage.isPresent() && qualifiedName.equals(currentPackage.get() + '.' + name)) { if (qualifiedName.equals(currentPackagePrefix.concat(name))) {
return true; return true;
} }
return false; return false;
Expand All @@ -409,12 +407,18 @@ void addException(String name) {
} }


void setCurrentPackage(String currentPackage) { void setCurrentPackage(String currentPackage) {
this.currentPackage = Optional.of(currentPackage); this.currentPackagePrefix = currentPackage.isEmpty() ? "" : (currentPackage + '.');
} }


void preBuild() { void preBuild() {
for (String exception : exceptions) { for (String exception : exceptions) {
importCandidates.removeAll(nameToQualified.get(exception)); @Nullable String qualifiedName = nameToQualified.get(exception);
if (qualifiedName != null) {
String asInCurrentPackage = currentPackagePrefix.concat(exception);
if (!qualifiedName.equals(asInCurrentPackage)) {
importCandidates.removeAll(qualifiedName);
}
}
} }


for (Map.Entry<String, ImportCandidate> candidateEntry : importCandidates.entries()) { for (Map.Entry<String, ImportCandidate> candidateEntry : importCandidates.entries()) {
Expand Down Expand Up @@ -692,6 +696,6 @@ private static boolean isUpperCaseAlphabetic(char c) {
} }


private static boolean isUnderscore(char c) { private static boolean isUnderscore(char c) {
return c == '_'; return c == '_';
} }
} }
Expand Up @@ -184,10 +184,12 @@ public void currentPackageImport() {
" private class Utils {}", " private class Utils {}",
"}")); "}"));


// Maybe this will end up wrong way, but following test was rewritten to still
// cut current package even in presense inner class Utils.
check(rewrited).hasToString( check(rewrited).hasToString(
LINES.join("package start;", LINES.join("package start;",
"", "",
"class Throwable extends start.Utils {", "class Throwable extends Utils {",
" private class Utils {}", " private class Utils {}",
"}")); "}"));
} }
Expand Down
1 change: 1 addition & 0 deletions mirror/src/org/immutables/mirror/processor/Processor.java
Expand Up @@ -26,5 +26,6 @@ public class Processor extends AbstractGenerator {
@Override @Override
protected void process() { protected void process() {
invoke(new Generator_Mirrors().generate()); invoke(new Generator_Mirrors().generate());
invoke(new Generator_Reflects().generate());
} }
} }

0 comments on commit 3a460d6

Please sign in to comment.