mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-69920 Support additional imports added by the Griffon compiler
This commit is contained in:
@@ -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>
|
||||
|
||||
+62
@@ -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"
|
||||
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
+114
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+35
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user