diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java index 1b8570a7dcc..382f5e3a052 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java @@ -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(); + } } diff --git a/compiler/testData/codegen/script/fibwp.lang.kt b/compiler/testData/codegen/script/fibwp.lang.kt index 5b0d322f7a0..2da99751f02 100644 --- a/compiler/testData/codegen/script/fibwp.lang.kt +++ b/compiler/testData/codegen/script/fibwp.lang.kt @@ -7,5 +7,5 @@ fun fib(n: Int): Int { return v } -val result = fib(num) +val result: Int = fib(num) 12 \ No newline at end of file