IDEA-69920 Support additional imports added by the Griffon compiler

This commit is contained in:
peter
2011-12-16 17:13:03 +01:00
parent 2b5d768064
commit f10baa830b
7 changed files with 222 additions and 36 deletions
+1
View File
@@ -46,6 +46,7 @@
<extensions defaultExtensionNs="org.intellij.groovy">
<positionManagerDelegate implementation="org.jetbrains.plugins.gradle.config.GradlePositionManager"/>
<scriptTypeDetector implementation="org.jetbrains.plugins.gradle.config.GradleScriptTypeDetector"/>
<defaultImportContributor implementation="org.jetbrains.plugins.gradle.config.GradleDefaultImportContributor"/>
</extensions>
<project-components>
@@ -0,0 +1,62 @@
/*
* Copyright 2000-2011 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.plugins.gradle.config;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.lang.resolve.DefaultImportContributor;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author peter
*/
public class GradleDefaultImportContributor extends DefaultImportContributor {
@Override
public List<String> appendImplicitlyImportedPackages(@NotNull GroovyFile file) {
if (file.isScript() && GroovyScriptTypeDetector.getScriptType(file) instanceof GradleScriptType) {
return Arrays.asList(
"org.gradle",
"org.gradle.util",
"org.gradle.api",
"org.gradle.api.artifacts",
"org.gradle.api.artifacts.dsl",
"org.gradle.api.artifacts.specs",
"org.gradle.api.dependencies",
"org.gradle.api.execution",
"org.gradle.api.file",
"org.gradle.api.logging",
"org.gradle.api.initialization",
"org.gradle.api.invocation",
"org.gradle.api.plugins",
"org.gradle.api.plugins.quality",
"org.gradle.api.specs",
"org.gradle.api.tasks",
"org.gradle.api.tasks.bundling",
"org.gradle.api.tasks.compile",
"org.gradle.api.tasks.javadoc",
"org.gradle.api.tasks.testing",
"org.gradle.api.tasks.util",
"org.gradle.api.tasks.wrapper"
);
}
return Collections.emptyList();
}
}
@@ -57,9 +57,7 @@ import org.jetbrains.plugins.groovy.util.GroovyUtils;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -279,33 +277,4 @@ public class GradleScriptType extends GroovyScriptType {
return result;
}
@Override
public List<String> appendImplicitImports(@NotNull GroovyFile file) {
return Arrays.asList(
"org.gradle",
"org.gradle.util",
"org.gradle.api",
"org.gradle.api.artifacts",
"org.gradle.api.artifacts.dsl",
"org.gradle.api.artifacts.specs",
"org.gradle.api.dependencies",
"org.gradle.api.execution",
"org.gradle.api.file",
"org.gradle.api.logging",
"org.gradle.api.initialization",
"org.gradle.api.invocation",
"org.gradle.api.plugins",
"org.gradle.api.plugins.quality",
"org.gradle.api.specs",
"org.gradle.api.tasks",
"org.gradle.api.tasks.bundling",
"org.gradle.api.tasks.compile",
"org.gradle.api.tasks.javadoc",
"org.gradle.api.tasks.testing",
"org.gradle.api.tasks.util",
"org.gradle.api.tasks.wrapper"
);
}
}
+2
View File
@@ -29,6 +29,7 @@
<extensionPoints>
<extensionPoint name="membersContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor"/>
<extensionPoint name="defaultImportContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.DefaultImportContributor"/>
<extensionPoint name="astTransformContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor"/>
<extensionPoint name="closureMissingMethodContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.ClosureMissingMethodContributor"/>
<extensionPoint name="variableEnhancer" interface="org.jetbrains.plugins.groovy.lang.psi.GrVariableEnhancer"/>
@@ -117,6 +118,7 @@
<mvc.framework implementation="org.jetbrains.plugins.groovy.griffon.GriffonFramework"/>
<groovyFrameworkConfigNotification implementation="org.jetbrains.plugins.groovy.griffon.GriffonConfigureNotification"/>
<defaultImportContributor implementation="org.jetbrains.plugins.groovy.griffon.GriffonDefaultImportContributor"/>
</extensions>
@@ -0,0 +1,114 @@
/*
* Copyright 2000-2011 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.plugins.groovy.griffon;
import com.intellij.lang.properties.IProperty;
import com.intellij.lang.properties.psi.PropertiesFile;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.lang.resolve.DefaultImportContributor;
import org.jetbrains.plugins.groovy.mvc.MvcFramework;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author peter
*/
public class GriffonDefaultImportContributor extends DefaultImportContributor {
private Pair<List<String>, List<String>> getDefaultImports(@NotNull final Module module) {
return CachedValuesManager.getManager(module.getProject()).getCachedValue(module, new CachedValueProvider<Pair<List<String>, List<String>>>() {
@Override
public Result<Pair<List<String>, List<String>>> compute() {
PsiPackage aPackage = JavaPsiFacade.getInstance(module.getProject()).findPackage("META-INF");
if (aPackage != null) {
for (PsiDirectory directory : aPackage.getDirectories(GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module))) {
PsiFile file = directory.findFile("griffon-default-imports.properties");
if (file instanceof PropertiesFile) {
List<String> modelImports = tokenize(((PropertiesFile)file).findPropertyByKey("models"));
List<String> viewImports = tokenize(((PropertiesFile)file).findPropertyByKey("views"));
return Result.create(Pair.create(modelImports, viewImports), PsiModificationTracker.MODIFICATION_COUNT);
}
}
}
return Result.create(new Pair<List<String>, List<String>>(new ArrayList<String>(), new ArrayList<String>()),
PsiModificationTracker.MODIFICATION_COUNT);
}
private List<String> tokenize(IProperty models) {
List<String> modelImports = new ArrayList<String>();
if (models != null) {
String value = models.getValue();
if (value != null) {
String[] split = value.split(", ");
for (String s : split) {
modelImports.add(StringUtil.trimEnd(s, "."));
}
}
}
return modelImports;
}
});
}
@Override
public List<String> appendImplicitlyImportedPackages(@NotNull GroovyFile file) {
Module module = ModuleUtil.findModuleForPsiElement(file);
MvcFramework framework = MvcFramework.getInstance(module);
if (framework instanceof GriffonFramework) {
ArrayList<String> result = new ArrayList<String>();
result.add("griffon.core");
result.add("griffon.util");
VirtualFile griffonApp = framework.findAppDirectory(file);
if (griffonApp != null) {
VirtualFile models = griffonApp.findChild("models");
VirtualFile views = griffonApp.findChild("views");
VirtualFile vFile = file.getOriginalFile().getVirtualFile();
assert vFile != null;
assert module != null;
if (models != null && VfsUtilCore.isAncestor(models, vFile, true)) {
result.addAll(getDefaultImports(module).first);
}
else if (views != null && VfsUtilCore.isAncestor(views, vFile, true)) {
result.addAll(getDefaultImports(module).second);
}
}
return result;
}
return Collections.emptyList();
}
}
@@ -24,7 +24,6 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.ElementBase;
import com.intellij.psi.impl.file.PsiPackageImpl;
import com.intellij.psi.scope.DelegatingScopeProcessor;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.stubs.StubElement;
@@ -55,12 +54,14 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightParameter;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
import org.jetbrains.plugins.groovy.lang.psi.stubs.GrFileStub;
import org.jetbrains.plugins.groovy.lang.resolve.DefaultImportContributor;
import org.jetbrains.plugins.groovy.lang.resolve.MethodTypeInferencer;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint;
import javax.swing.*;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
/**
@@ -222,12 +223,14 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile {
}
private List<String> getImplicitlyImportedPackages() {
final ArrayList<String> result = new ArrayList<String>();
private LinkedHashSet<String> getImplicitlyImportedPackages() {
final LinkedHashSet<String> result = new LinkedHashSet<String>();
ContainerUtil.addAll(result, IMPLICITLY_IMPORTED_PACKAGES);
if (isScript()) {
result.addAll(GroovyScriptTypeDetector.getScriptType(this).appendImplicitImports(this));
for (DefaultImportContributor contributor : DefaultImportContributor.EP_NAME.getExtensions()) {
result.addAll(contributor.appendImplicitlyImportedPackages(this));
}
return result;
}
@@ -0,0 +1,35 @@
/*
* Copyright 2000-2011 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.plugins.groovy.lang.resolve;
import com.intellij.openapi.extensions.ExtensionPointName;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import java.util.Collections;
import java.util.List;
/**
* @author peter
*/
public abstract class DefaultImportContributor {
public static final ExtensionPointName<DefaultImportContributor> EP_NAME = ExtensionPointName.create("org.intellij.groovy.defaultImportContributor");
public List<String> appendImplicitlyImportedPackages(@NotNull GroovyFile file) {
return Collections.emptyList();
}
}