default imports added to script definitions

This commit is contained in:
Alex Tkachman
2012-08-01 23:05:56 +03:00
parent 2677c8842e
commit 29054586d3
6 changed files with 69 additions and 6 deletions
@@ -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<AnalyzerScriptParameter> parameters;
private final List<ImportPath> imports;
public JetScriptDefinition(String extension, List<AnalyzerScriptParameter> scriptParameters, @Nullable List<String> imports) {
this.extension = extension;
parameters = scriptParameters == null ? Collections.<AnalyzerScriptParameter>emptyList() : scriptParameters;
this.imports = imports == null || imports.isEmpty() ? Collections.<ImportPath>emptyList() : importPaths(imports);
}
private static List<ImportPath> importPaths(List<String> imports) {
ArrayList<ImportPath> paths = new ArrayList<ImportPath>(imports.size());
for (String anImport : imports) {
paths.add(new ImportPath(anImport));
}
return paths;
}
public JetScriptDefinition(String extension, List<AnalyzerScriptParameter> 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<ImportPath> getImports() {
return imports;
}
}
@@ -29,7 +29,7 @@ public class JetScriptDefinitionProvider {
private final HashMap<String,JetScriptDefinition> scripts = new HashMap<String, JetScriptDefinition>();
private final HashSet<PsiFile> scriptsFiles = new HashSet<PsiFile>();
private static JetScriptDefinition standardScript = new JetScriptDefinition(".ktscript", Collections.<AnalyzerScriptParameter>emptyList());
private static final JetScriptDefinition standardScript = new JetScriptDefinition(".ktscript", Collections.<AnalyzerScriptParameter>emptyList());
public JetScriptDefinitionProvider() {
// .ktscript will take analyzer parameters explicitly specified on compilation
@@ -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);
@@ -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<JetImportDirective> importDirectives = Lists.newArrayList(file.getImportDirectives());
List<JetImportDirective> importDirectives = getFileImports(file);
ImportsResolver.processImportsInFile(true, writableScope, importDirectives,
rootPackageDescriptor.getMemberScope(),
@@ -86,6 +90,22 @@ public class ScopeProvider {
return writableScope;
}
public static List<JetImportDirective> getFileImports(JetFile file) {
List<JetImportDirective> fileImports = file.getImportDirectives();
List<JetImportDirective> importDirectives = Lists.newArrayList();
if(file.isScript()) {
JetScriptDefinition definition = JetScriptDefinitionProvider.getInstance(file.getProject()).findScriptDefinition(file);
List<ImportPath> 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();
@@ -0,0 +1 @@
Collections.emptyList<String>()
@@ -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);
}
}
}