Do not add functions and properties with inferred types as script class memebrs

This commit is contained in:
Andrey Breslav
2014-03-27 18:14:37 +04:00
parent 9a1f8b9cc6
commit f81bf5ea73
2 changed files with 13 additions and 5 deletions
@@ -22,10 +22,7 @@ import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptorImpl; import org.jetbrains.jet.lang.descriptors.ScriptDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.lang.psi.JetScript;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.ErrorUtils;
@@ -82,9 +79,13 @@ public class ScriptBodyResolver {
BindingContext bindingContext = trace.getBindingContext(); BindingContext bindingContext = trace.getBindingContext();
for (JetDeclaration jetDeclaration : declaration.getDeclarations()) { for (JetDeclaration jetDeclaration : declaration.getDeclarations()) {
if (jetDeclaration instanceof JetProperty) { if (jetDeclaration instanceof JetProperty) {
if (!shouldBeScriptClassMember(jetDeclaration)) continue;
properties.add((PropertyDescriptorImpl) bindingContext.get(BindingContext.VARIABLE, jetDeclaration)); properties.add((PropertyDescriptorImpl) bindingContext.get(BindingContext.VARIABLE, jetDeclaration));
} }
else if (jetDeclaration instanceof JetNamedFunction) { else if (jetDeclaration instanceof JetNamedFunction) {
if (!shouldBeScriptClassMember(jetDeclaration)) continue;
SimpleFunctionDescriptor function = bindingContext.get(BindingContext.FUNCTION, jetDeclaration); SimpleFunctionDescriptor function = bindingContext.get(BindingContext.FUNCTION, jetDeclaration);
assert function != null; assert function != null;
functions.add(function.copy(descriptor.getClassDescriptor(), function.getModality(), function.getVisibility(), functions.add(function.copy(descriptor.getClassDescriptor(), function.getModality(), function.getVisibility(),
@@ -96,4 +97,11 @@ public class ScriptBodyResolver {
} }
} }
public static boolean shouldBeScriptClassMember(@NotNull JetDeclaration declaration) {
// To avoid the necessity to always analyze the whole body of a script even if just its class descriptor is needed
// we only add those vals, vars and funs that have explicitly specified return types
// (or implicit Unit for function with block body)
return declaration instanceof JetCallableDeclaration && ((JetCallableDeclaration) declaration).getReturnTypeRef() != null ||
declaration instanceof JetNamedFunction && ((JetNamedFunction) declaration).hasBlockBody();
}
} }
@@ -7,5 +7,5 @@ fun fib(n: Int): Int {
return v return v
} }
val result = fib(num) val result: Int = fib(num)
12 12