diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 11913af3233..19b42f4e948 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -57,6 +57,7 @@ import org.jetbrains.jet.lang.resolve.DeclarationResolver; import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; +import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; @@ -115,6 +116,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final ImportsResolver importsResolver; private final JetImportsFactory jetImportsFactory; private final ScriptHeaderResolver scriptHeaderResolver; + private final ScriptParameterResolver scriptParameterResolver; private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; @@ -177,6 +179,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.importsResolver = new ImportsResolver(); this.jetImportsFactory = new JetImportsFactory(); this.scriptHeaderResolver = new ScriptHeaderResolver(); + this.scriptParameterResolver = new ScriptParameterResolver(); this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); @@ -289,10 +292,12 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly jetImportsFactory.setProject(project); - scriptHeaderResolver.setDependencyClassByQualifiedNameResolver(javaDescriptorResolver); scriptHeaderResolver.setPackageFragmentProvider(mutablePackageFragmentProvider); + scriptHeaderResolver.setScriptParameterResolver(scriptParameterResolver); scriptHeaderResolver.setTrace(bindingTrace); + scriptParameterResolver.setDependencyClassByQualifiedNameResolver(javaDescriptorResolver); + overloadResolver.setTrace(bindingTrace); overrideResolver.setTrace(bindingTrace); diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java index 7f766d86a1f..60b3fbbf92b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java @@ -49,6 +49,7 @@ import org.jetbrains.jet.lang.resolve.DeclarationResolver; import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; +import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; @@ -92,6 +93,7 @@ public class InjectorForTopDownAnalyzerBasic { private final ImportsResolver importsResolver; private final JetImportsFactory jetImportsFactory; private final ScriptHeaderResolver scriptHeaderResolver; + private final ScriptParameterResolver scriptParameterResolver; private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; @@ -135,6 +137,7 @@ public class InjectorForTopDownAnalyzerBasic { this.importsResolver = new ImportsResolver(); this.jetImportsFactory = new JetImportsFactory(); this.scriptHeaderResolver = new ScriptHeaderResolver(); + this.scriptParameterResolver = new ScriptParameterResolver(); this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); @@ -231,10 +234,12 @@ public class InjectorForTopDownAnalyzerBasic { jetImportsFactory.setProject(project); - scriptHeaderResolver.setDependencyClassByQualifiedNameResolver(dependencyClassByQualifiedNameResolverDummy); scriptHeaderResolver.setPackageFragmentProvider(mutablePackageFragmentProvider); + scriptHeaderResolver.setScriptParameterResolver(scriptParameterResolver); scriptHeaderResolver.setTrace(bindingTrace); + scriptParameterResolver.setDependencyClassByQualifiedNameResolver(dependencyClassByQualifiedNameResolverDummy); + overloadResolver.setTrace(bindingTrace); overrideResolver.setTrace(bindingTrace); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java index a52c5ff6dc7..2106b7f6bc4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java @@ -16,14 +16,12 @@ package org.jetbrains.jet.lang.resolve; -import com.google.common.collect.Lists; import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.descriptors.annotations.Annotations; -import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; -import org.jetbrains.jet.lang.parsing.JetScriptDefinition; -import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider; +import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; +import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; +import org.jetbrains.jet.lang.descriptors.ScriptDescriptorImpl; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetScript; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -31,13 +29,8 @@ import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; -import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.TypeUtils; -import org.jetbrains.jet.lang.types.ref.JetTypeName; import javax.inject.Inject; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -49,7 +42,7 @@ public class ScriptHeaderResolver { @NotNull private MutablePackageFragmentProvider packageFragmentProvider; @NotNull - private DependencyClassByQualifiedNameResolver dependencyClassByQualifiedNameResolver; + private ScriptParameterResolver scriptParameterResolver; @NotNull private BindingTrace trace; @@ -59,8 +52,8 @@ public class ScriptHeaderResolver { } @Inject - public void setDependencyClassByQualifiedNameResolver(@NotNull DependencyClassByQualifiedNameResolver dependencyClassByQualifiedNameResolver) { - this.dependencyClassByQualifiedNameResolver = dependencyClassByQualifiedNameResolver; + public void setScriptParameterResolver(@NotNull ScriptParameterResolver scriptParameterResolver) { + this.scriptParameterResolver = scriptParameterResolver; } @Inject @@ -69,34 +62,6 @@ public class ScriptHeaderResolver { } - @NotNull - private ClassDescriptor resolveClass(@NotNull FqName className) { - ClassDescriptor classDescriptor = dependencyClassByQualifiedNameResolver.resolveClass(className); - if (classDescriptor == null) { - throw new IllegalStateException("dependency class not found by name: " + className); - } - return classDescriptor; - } - - @NotNull - public JetType resolveTypeName(@NotNull JetTypeName typeName) { - List typeArguments = new ArrayList(); - for (JetTypeName typeArgumentName : typeName.getArguments()) { - typeArguments.add(resolveTypeName(typeArgumentName)); - } - ClassDescriptor classDescriptor = resolveClass(typeName.getClassName()); - return TypeUtils.substituteParameters(classDescriptor, typeArguments); - } - - - @NotNull - private ValueParameterDescriptor resolveScriptParameter( - @NotNull AnalyzerScriptParameter scriptParameter, - int index, - @NotNull ScriptDescriptor script) { - JetType type = resolveTypeName(scriptParameter.getType()); - return new ValueParameterDescriptorImpl(script, null, index, Annotations.EMPTY, scriptParameter.getName(), type, false, null); - } public void processScriptHierarchy(@NotNull TopDownAnalysisContext c, @NotNull JetScript script, @NotNull WritableScope outerScope) { JetFile file = (JetFile) script.getContainingFile(); @@ -130,7 +95,7 @@ public class ScriptHeaderResolver { JetScript declaration = e.getKey(); ScriptDescriptorImpl descriptor = (ScriptDescriptorImpl) e.getValue(); - List valueParameters = resolveScriptParameters(c, declaration, descriptor); + List valueParameters = scriptParameterResolver.resolveScriptParameters(c, declaration, descriptor); descriptor.setValueParameters(valueParameters); @@ -142,27 +107,4 @@ public class ScriptHeaderResolver { } } - @NotNull - public List resolveScriptParameters( - @NotNull TopDownAnalysisContext c, - @NotNull JetScript declaration, - @NotNull ScriptDescriptor scriptDescriptor - ) { - List valueParameters = Lists.newArrayList(); - - JetFile file = (JetFile) declaration.getContainingFile(); - JetScriptDefinition scriptDefinition = JetScriptDefinitionProvider.getInstance(file.getProject()).findScriptDefinition(file); - - int index = 0; - List scriptParameters = !scriptDefinition.getScriptParameters().isEmpty() - ? scriptDefinition.getScriptParameters() - : c.getTopDownAnalysisParameters().getScriptParameters(); - - for (AnalyzerScriptParameter scriptParameter : scriptParameters) { - ValueParameterDescriptor parameter = resolveScriptParameter(scriptParameter, index, scriptDescriptor); - valueParameters.add(parameter); - ++index; - } - return valueParameters; - } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptParameterResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptParameterResolver.java new file mode 100644 index 00000000000..b2e7055722b --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptParameterResolver.java @@ -0,0 +1,102 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve; + +import com.google.common.collect.Lists; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.descriptors.annotations.Annotations; +import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; +import org.jetbrains.jet.lang.parsing.JetScriptDefinition; +import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetScript; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.lang.types.ref.JetTypeName; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; + +// SCRIPT: Resolve script parameters +public class ScriptParameterResolver { + @NotNull + private DependencyClassByQualifiedNameResolver dependencyClassByQualifiedNameResolver; + + @Inject + public void setDependencyClassByQualifiedNameResolver(@NotNull DependencyClassByQualifiedNameResolver dependencyClassByQualifiedNameResolver) { + this.dependencyClassByQualifiedNameResolver = dependencyClassByQualifiedNameResolver; + } + + @NotNull + public List resolveScriptParameters( + @NotNull TopDownAnalysisContext c, + @NotNull JetScript declaration, + @NotNull ScriptDescriptor scriptDescriptor + ) { + List valueParameters = Lists.newArrayList(); + + JetFile file = (JetFile) declaration.getContainingFile(); + JetScriptDefinition scriptDefinition = JetScriptDefinitionProvider.getInstance(file.getProject()).findScriptDefinition(file); + + int index = 0; + List scriptParameters = !scriptDefinition.getScriptParameters().isEmpty() + ? scriptDefinition.getScriptParameters() + : c.getTopDownAnalysisParameters().getScriptParameters(); + + for (AnalyzerScriptParameter scriptParameter : scriptParameters) { + ValueParameterDescriptor parameter = resolveScriptParameter(scriptParameter, index, scriptDescriptor); + valueParameters.add(parameter); + ++index; + } + return valueParameters; + } + + @NotNull + private ClassDescriptor resolveClass(@NotNull FqName className) { + ClassDescriptor classDescriptor = dependencyClassByQualifiedNameResolver.resolveClass(className); + if (classDescriptor == null) { + throw new IllegalStateException("dependency class not found by name: " + className); + } + return classDescriptor; + } + + @NotNull + public JetType resolveTypeName(@NotNull JetTypeName typeName) { + List typeArguments = new ArrayList(); + for (JetTypeName typeArgumentName : typeName.getArguments()) { + typeArguments.add(resolveTypeName(typeArgumentName)); + } + ClassDescriptor classDescriptor = resolveClass(typeName.getClassName()); + return TypeUtils.substituteParameters(classDescriptor, typeArguments); + } + + + @NotNull + private ValueParameterDescriptor resolveScriptParameter( + @NotNull AnalyzerScriptParameter scriptParameter, + int index, + @NotNull ScriptDescriptor script) { + JetType type = resolveTypeName(scriptParameter.getType()); + return new ValueParameterDescriptorImpl(script, null, index, Annotations.EMPTY, scriptParameter.getName(), type, false, null); + } +} diff --git a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java index 1f939dd8af6..6453fbac973 100644 --- a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java +++ b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java @@ -49,6 +49,7 @@ import org.jetbrains.jet.lang.resolve.DeclarationResolver; import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; +import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; @@ -92,6 +93,7 @@ public class InjectorForTopDownAnalyzerForJs { private final ImportsResolver importsResolver; private final JetImportsFactory jetImportsFactory; private final ScriptHeaderResolver scriptHeaderResolver; + private final ScriptParameterResolver scriptParameterResolver; private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; @@ -135,6 +137,7 @@ public class InjectorForTopDownAnalyzerForJs { this.importsResolver = new ImportsResolver(); this.jetImportsFactory = new JetImportsFactory(); this.scriptHeaderResolver = new ScriptHeaderResolver(); + this.scriptParameterResolver = new ScriptParameterResolver(); this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); @@ -231,10 +234,12 @@ public class InjectorForTopDownAnalyzerForJs { jetImportsFactory.setProject(project); - scriptHeaderResolver.setDependencyClassByQualifiedNameResolver(dependencyClassByQualifiedNameResolverDummy); scriptHeaderResolver.setPackageFragmentProvider(mutablePackageFragmentProvider); + scriptHeaderResolver.setScriptParameterResolver(scriptParameterResolver); scriptHeaderResolver.setTrace(bindingTrace); + scriptParameterResolver.setDependencyClassByQualifiedNameResolver(dependencyClassByQualifiedNameResolverDummy); + overloadResolver.setTrace(bindingTrace); overrideResolver.setTrace(bindingTrace);