diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinition.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinition.java index 05f6f7623e7..cfd97e990af 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinition.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinition.java @@ -16,18 +16,36 @@ package org.jetbrains.jet.lang.parsing; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; +import org.jetbrains.jet.lang.resolve.ImportPath; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; public class JetScriptDefinition { private final String extension; private final List parameters; + private final List imports; + + public JetScriptDefinition(String extension, List scriptParameters, @Nullable List imports) { + this.extension = extension; + parameters = scriptParameters == null ? Collections.emptyList() : scriptParameters; + this.imports = imports == null || imports.isEmpty() ? Collections.emptyList() : importPaths(imports); + } + + private static List importPaths(List imports) { + ArrayList paths = new ArrayList(imports.size()); + for (String anImport : imports) { + paths.add(new ImportPath(anImport)); + } + return paths; + } public JetScriptDefinition(String extension, List scriptParameters) { - this.extension = extension; - parameters = scriptParameters; + this(extension, scriptParameters, null); } public JetScriptDefinition(String extension, AnalyzerScriptParameter... scriptParameters) { @@ -41,4 +59,8 @@ public class JetScriptDefinition { public String getExtension() { return extension; } + + public List getImports() { + return imports; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinitionProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinitionProvider.java index 876b1eedaa9..c3030255a37 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinitionProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetScriptDefinitionProvider.java @@ -29,7 +29,7 @@ public class JetScriptDefinitionProvider { private final HashMap scripts = new HashMap(); private final HashSet scriptsFiles = new HashSet(); - private static JetScriptDefinition standardScript = new JetScriptDefinition(".ktscript", Collections.emptyList()); + private static final JetScriptDefinition standardScript = new JetScriptDefinition(".ktscript", Collections.emptyList()); public JetScriptDefinitionProvider() { // .ktscript will take analyzer parameters explicitly specified on compilation diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java index 56fbf2d9420..9784d7bf31f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.ModuleConfiguration; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; @@ -79,7 +80,7 @@ public class ImportsResolver { private void processImports(boolean onlyClasses, @NotNull JetScope rootScope) { for (JetFile file : context.getNamespaceDescriptors().keySet()) { WritableScope namespaceScope = context.getNamespaceScopes().get(file); - processImportsInFile(onlyClasses, namespaceScope, file.getImportDirectives(), rootScope); + processImportsInFile(onlyClasses, namespaceScope, ScopeProvider.getFileImports(file), rootScope); } for (JetScript script : context.getScripts().keySet()) { WritableScope scriptScope = context.getScriptScopes().get(script); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java index 4552dcda667..7968692d61a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java @@ -21,7 +21,11 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.parsing.JetParserDefinition; +import org.jetbrains.jet.lang.parsing.JetScriptDefinition; +import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -72,7 +76,7 @@ public class ScopeProvider { writableScope.importScope(rootPackageDescriptor.getMemberScope()); } - List importDirectives = Lists.newArrayList(file.getImportDirectives()); + List importDirectives = getFileImports(file); ImportsResolver.processImportsInFile(true, writableScope, importDirectives, rootPackageDescriptor.getMemberScope(), @@ -86,6 +90,22 @@ public class ScopeProvider { return writableScope; } + public static List getFileImports(JetFile file) { + List fileImports = file.getImportDirectives(); + List importDirectives = Lists.newArrayList(); + if(file.isScript()) { + JetScriptDefinition definition = JetScriptDefinitionProvider.getInstance(file.getProject()).findScriptDefinition(file); + List imports = definition.getImports(); + if(!imports.isEmpty()) { + for (ImportPath importPath : imports) { + importDirectives.add(JetPsiFactory.createImportDirective(file.getProject(), importPath)); + } + } + } + importDirectives.addAll(fileImports); + return importDirectives; + } + @NotNull public JetScope getResolutionScopeForDeclaration(@NotNull JetDeclaration jetDeclaration) { PsiElement immediateParent = jetDeclaration.getParent(); diff --git a/compiler/testData/codegen/script/withdefimports.def.kt b/compiler/testData/codegen/script/withdefimports.def.kt new file mode 100644 index 00000000000..9f2cac3c405 --- /dev/null +++ b/compiler/testData/codegen/script/withdefimports.def.kt @@ -0,0 +1 @@ +Collections.emptyList() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java index 6579791524b..dac4fdf52b2 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java @@ -27,6 +27,8 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -37,6 +39,9 @@ public class ScriptGenTest extends CodegenTestCase { public static final JetScriptDefinition FIB_SCRIPT_DEFINITION = new JetScriptDefinition(".lang.kt", new AnalyzerScriptParameter("num", "jet.Int")); + public static final JetScriptDefinition DEFIMPORT_SCRIPT_DEFINITION = + new JetScriptDefinition(".def.kt", null, Arrays.asList("java.util.Collections")); + @Override protected void setUp() throws Exception { super.setUp(); @@ -131,7 +136,6 @@ public class ScriptGenTest extends CodegenTestCase { public void testDependentScripts() { JetScriptDefinitionProvider.getInstance(myEnvironment.getProject()).addScriptDefinition(FIB_SCRIPT_DEFINITION); loadFiles("script/fibwp.lang.kt", "script/fibwprunner.ktscript"); - System.out.println(generateToText()); final Class aClass = loadClass("Fibwprunner", generateClassesInFile()); try { Constructor constructor = aClass.getConstructor(); @@ -145,4 +149,19 @@ public class ScriptGenTest extends CodegenTestCase { throw new RuntimeException(e); } } + + public void testDefImports() { + JetScriptDefinitionProvider.getInstance(myEnvironment.getProject()).addScriptDefinition(DEFIMPORT_SCRIPT_DEFINITION); + loadFile("script/withdefimports.def.kt"); + final Class aClass = loadClass("Withdefimports", generateClassesInFile()); + try { + Constructor constructor = aClass.getConstructor(); + Field rv = aClass.getField("rv"); + Object script = constructor.newInstance(); + assertEquals(Collections.emptyList(),rv.get(script)); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } }