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.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetDeclaration;
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.psi.*;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.ErrorUtils;
@@ -82,9 +79,13 @@ public class ScriptBodyResolver {
BindingContext bindingContext = trace.getBindingContext();
for (JetDeclaration jetDeclaration : declaration.getDeclarations()) {
if (jetDeclaration instanceof JetProperty) {
if (!shouldBeScriptClassMember(jetDeclaration)) continue;
properties.add((PropertyDescriptorImpl) bindingContext.get(BindingContext.VARIABLE, jetDeclaration));
}
else if (jetDeclaration instanceof JetNamedFunction) {
if (!shouldBeScriptClassMember(jetDeclaration)) continue;
SimpleFunctionDescriptor function = bindingContext.get(BindingContext.FUNCTION, jetDeclaration);
assert function != null;
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
}
val result = fib(num)
val result: Int = fib(num)
12