Fewer TypeInferrerVisitor instances generated
This commit is contained in:
@@ -83,13 +83,7 @@ public class JetTypeInferrer {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public JetType getType(@NotNull final JetScope scope, @NotNull JetExpression expression, final boolean preferBlock) {
|
public JetType getType(@NotNull final JetScope scope, @NotNull JetExpression expression, final boolean preferBlock) {
|
||||||
TypeInferrerVisitor visitor = new TypeInferrerVisitor(scope, preferBlock);
|
return new TypeInferrerVisitor(scope, preferBlock).getType(expression);
|
||||||
expression.accept(visitor);
|
|
||||||
JetType result = visitor.getResult();
|
|
||||||
if (result != null) {
|
|
||||||
trace.recordExpressionType(expression, result);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -104,12 +98,14 @@ public class JetTypeInferrer {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private List<JetType> getTypes(JetScope scope, List<JetExpression> indexExpressions) {
|
private List<JetType> getTypes(JetScope scope, List<JetExpression> indexExpressions) {
|
||||||
List<JetType> argumentTypes = new ArrayList<JetType>();
|
List<JetType> argumentTypes = new ArrayList<JetType>();
|
||||||
|
TypeInferrerVisitor typeInferrerVisitor = new TypeInferrerVisitor(scope, false);
|
||||||
for (JetExpression indexExpression : indexExpressions) {
|
for (JetExpression indexExpression : indexExpressions) {
|
||||||
JetType type = getType(scope, indexExpression, false);
|
JetType type = typeInferrerVisitor.getType(indexExpression);
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
argumentTypes.add(type);
|
argumentTypes.add(type);
|
||||||
|
typeInferrerVisitor.resetResult(); // TODO : recreate?
|
||||||
}
|
}
|
||||||
return argumentTypes;
|
return argumentTypes;
|
||||||
}
|
}
|
||||||
@@ -276,7 +272,6 @@ public class JetTypeInferrer {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private JetType getBlockReturnedType(@NotNull JetScope outerScope, List<JetElement> block) {
|
private JetType getBlockReturnedType(@NotNull JetScope outerScope, List<JetElement> block) {
|
||||||
if (block.isEmpty()) {
|
if (block.isEmpty()) {
|
||||||
return JetStandardClasses.getUnitType();
|
return JetStandardClasses.getUnitType();
|
||||||
@@ -292,11 +287,7 @@ public class JetTypeInferrer {
|
|||||||
TypeInferrerVisitorWithWritableScope blockLevelVisitor = new TypeInferrerVisitorWithWritableScope(scope, true);
|
TypeInferrerVisitorWithWritableScope blockLevelVisitor = new TypeInferrerVisitorWithWritableScope(scope, true);
|
||||||
JetType result = null;
|
JetType result = null;
|
||||||
for (JetElement statement : block) {
|
for (JetElement statement : block) {
|
||||||
statement.accept(blockLevelVisitor);
|
result = blockLevelVisitor.getType((JetExpression) statement);
|
||||||
result = blockLevelVisitor.getResult();
|
|
||||||
if (result != null) {
|
|
||||||
trace.recordExpressionType((JetExpression) statement, result);
|
|
||||||
}
|
|
||||||
blockLevelVisitor.resetResult(); // TODO : maybe it's better to recreate the visitors with the same scope?
|
blockLevelVisitor.resetResult(); // TODO : maybe it's better to recreate the visitors with the same scope?
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -318,18 +309,42 @@ public class JetTypeInferrer {
|
|||||||
|
|
||||||
private class TypeInferrerVisitor extends JetVisitor {
|
private class TypeInferrerVisitor extends JetVisitor {
|
||||||
private final JetScope scope;
|
private final JetScope scope;
|
||||||
protected JetType result;
|
|
||||||
private final boolean preferBlock;
|
private final boolean preferBlock;
|
||||||
|
protected JetType result;
|
||||||
|
|
||||||
public TypeInferrerVisitor(JetScope scope, boolean preferBlock) {
|
private TypeInferrerVisitor(JetScope scope, boolean preferBlock) {
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
this.preferBlock = preferBlock;
|
this.preferBlock = preferBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
public JetType getResult() {
|
@Nullable
|
||||||
|
public JetType getType(@NotNull final JetScope scope, @NotNull JetExpression expression, final boolean preferBlock) {
|
||||||
|
TypeInferrerVisitor visitor;
|
||||||
|
if (this.scope == scope && this.preferBlock == preferBlock && result == null) {
|
||||||
|
visitor = this;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
visitor = new TypeInferrerVisitor(scope, preferBlock);
|
||||||
|
}
|
||||||
|
JetType type = visitor.getType(expression);
|
||||||
|
visitor.result = null;
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public JetType getType(@NotNull JetExpression expression) {
|
||||||
|
assert result == null;
|
||||||
|
expression.accept(this);
|
||||||
|
if (result != null) {
|
||||||
|
trace.recordExpressionType(expression, result);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resetResult() {
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitSimpleNameExpression(JetSimpleNameExpression expression) {
|
public void visitSimpleNameExpression(JetSimpleNameExpression expression) {
|
||||||
// TODO : other members
|
// TODO : other members
|
||||||
@@ -1172,10 +1187,6 @@ public class JetTypeInferrer {
|
|||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetResult() {
|
|
||||||
this.result = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitProperty(JetProperty property) {
|
public void visitProperty(JetProperty property) {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user