Merge branch 'master' of git@git.labs.intellij.net:idea/community

This commit is contained in:
Kirill Kalishev
2011-03-15 19:12:13 +03:00
22 changed files with 167 additions and 222 deletions
@@ -99,11 +99,14 @@ public class PositionManagerImpl implements PositionManager {
waitRequestor.set(new ClassPrepareRequestor() {
public void processClassPrepare(DebugProcess debuggerProcess, ReferenceType referenceType) {
final CompoundPositionManager positionManager = ((DebugProcessImpl)debuggerProcess).getPositionManager();
if (positionManager.locationsOfLine(referenceType, position).size() > 0) {
requestor.processClassPrepare(debuggerProcess, referenceType);
final List<ReferenceType> positionClasses = positionManager.getAllClasses(position);
if (positionClasses.isEmpty()) {
// fallback
if (positionManager.locationsOfLine(referenceType, position).size() > 0) {
requestor.processClassPrepare(debuggerProcess, referenceType);
}
}
else {
final List<ReferenceType> positionClasses = positionManager.getAllClasses(position);
if (positionClasses.contains(referenceType)) {
requestor.processClassPrepare(debuggerProcess, referenceType);
}
@@ -267,15 +270,17 @@ public class PositionManagerImpl implements PositionManager {
final List<ReferenceType> nestedTypes = vmProxy.nestedTypes(fromClass);
for (ReferenceType nested : nestedTypes) {
final ReferenceType found = findNested(nested, classToFind, classPosition);
if (found != null) {
return found;
}
}
try {
final int lineNumber = classPosition.getLine() + 1;
for (ReferenceType nested : nestedTypes) {
final ReferenceType found = findNested(nested, classToFind, classPosition);
if (found != null) {
// check if enclosing class also has executable code at the same line, and if yes, prefer enclosing class
return fromClass.locationsOfLine(lineNumber).isEmpty()? found : fromClass;
}
}
if (fromClass.locationsOfLine(lineNumber).size() > 0) {
return fromClass;
}
@@ -38,10 +38,7 @@ import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy {
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.jdi.VirtualMachineProxyImpl");
@@ -87,12 +84,29 @@ public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy {
List<ReferenceType> nestedTypes = myNestedClassesCache.get(refType);
if (nestedTypes == null) {
final List<ReferenceType> list = refType.nestedTypes();
nestedTypes = new ArrayList<ReferenceType>(list.size());
final ClassLoaderReference outerLoader = refType.classLoader();
for (ReferenceType type : list) {
if (outerLoader == null? type.classLoader() == null : outerLoader.equals(type.classLoader())) {
nestedTypes.add(type);
final int size = list.size();
if (size > 0) {
final Set<ReferenceType> candidates = new HashSet<ReferenceType>();
final ClassLoaderReference outerLoader = refType.classLoader();
for (ReferenceType nested : list) {
if (outerLoader == null? nested.classLoader() == null : outerLoader.equals(nested.classLoader())) {
candidates.add(nested);
}
}
if (!candidates.isEmpty()) {
// keep only direct nested types
final Set<ReferenceType> nested2 = new HashSet<ReferenceType>();
for (final ReferenceType candidate : candidates) {
nested2.addAll(nestedTypes(candidate));
}
candidates.removeAll(nested2);
}
nestedTypes = candidates.isEmpty()? Collections.<ReferenceType>emptyList() : new ArrayList<ReferenceType>(candidates);
}
else {
nestedTypes = Collections.emptyList();
}
myNestedClassesCache.put(refType, nestedTypes);
}
@@ -130,16 +130,27 @@ public class LineBreakpoint extends BreakpointWithHighlighter {
try {
List<Location> locs = debugProcess.getPositionManager().locationsOfLine(classType, getSourcePosition());
if (locs.size() > 0) {
for (final Location location : locs) {
if (LOG.isDebugEnabled()) {
LOG.debug("Found location for reference type " + classType.name() + " at line " + getLineIndex() + "; isObsolete: " + (debugProcess.getVirtualMachineProxy().versionHigher("1.4") && location.method().isObsolete()));
Location minLocation = null;
for (final Location loc : locs) {
if (minLocation == null) {
minLocation = loc;
}
BreakpointRequest request = debugProcess.getRequestsManager().createBreakpointRequest(LineBreakpoint.this, location);
debugProcess.getRequestsManager().enableRequest(request);
if (LOG.isDebugEnabled()) {
LOG.debug("Created breakpoint request for reference type " + classType.name() + " at line " + getLineIndex());
else if (loc.codeIndex() < minLocation.codeIndex()) {
minLocation = loc;
}
}
assert minLocation != null;
if (LOG.isDebugEnabled()) {
LOG.debug("Found location for reference type " + classType.name() + " at line " + getLineIndex() + "; isObsolete: " + (debugProcess.getVirtualMachineProxy().versionHigher("1.4") && minLocation
.method().isObsolete()));
}
BreakpointRequest request = debugProcess.getRequestsManager().createBreakpointRequest(LineBreakpoint.this, minLocation);
debugProcess.getRequestsManager().enableRequest(request);
if (LOG.isDebugEnabled()) {
LOG.debug("Created breakpoint request for reference type " + classType.name() + " at line " + getLineIndex());
}
}
else {
// there's no executable code in this class
@@ -238,6 +238,9 @@ public class SearchResults {
myCursor = null;
}
}
if (myCursor == null && hasMatches()) {
setNotFoundState(true);
}
}
@Nullable
@@ -30,7 +30,7 @@ import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.indexing.FileBasedIndex;
import org.jdom.Attribute;
import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Map;
@@ -115,8 +115,8 @@ public class ProjectFileExclusionManager implements PersistentStateComponent<Ele
}
}
@Nullable
public static ProjectFileExclusionManager getInstance(Project project) {
public static ProjectFileExclusionManager getInstance(@NotNull Project project) {
return ServiceManager.getService(project, ProjectFileExclusionManager.class);
}
}
@@ -1,38 +0,0 @@
/*
* 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 com.intellij.openapi.file.exclude;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
/**
* @author Rustam Vishnyakov
*/
public class ProjectFileExclusionProvider extends FileExclusionProvider {
private final ProjectFileExclusionManager myFileExclusionManager;
public ProjectFileExclusionProvider(Project project) {
myFileExclusionManager = ProjectFileExclusionManager.getInstance(project);
}
@Override
public boolean isFileExcluded(VirtualFile file) {
return myFileExclusionManager.isExcluded(file);
}
}
@@ -16,6 +16,7 @@
package com.intellij.openapi.roots.impl;
import com.intellij.openapi.file.exclude.ProjectFileExclusionManager;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
@@ -36,6 +37,7 @@ public class ModuleFileIndexImpl implements ModuleFileIndex {
private final FileTypeManager myFileTypeManager;
private final DirectoryIndex myDirectoryIndex;
private final ContentFilter myContentFilter;
private final ProjectFileExclusionManager myExclusionManager;
public ModuleFileIndexImpl(Module module, DirectoryIndex directoryIndex) {
myModule = module;
@@ -43,6 +45,7 @@ public class ModuleFileIndexImpl implements ModuleFileIndex {
myFileTypeManager = FileTypeManager.getInstance();
myContentFilter = new ContentFilter();
myExclusionManager = ProjectFileExclusionManager.getInstance(module.getProject());
}
public boolean iterateContent(@NotNull ContentIterator iterator) {
@@ -153,6 +156,7 @@ public class ModuleFileIndexImpl implements ModuleFileIndex {
return info != null && myModule.equals(info.module);
}
else {
if(myExclusionManager.isExcluded(file)) return false;
return !myFileTypeManager.isFileIgnored(file);
}
}
@@ -18,6 +18,7 @@ package com.intellij.openapi.roots.impl;
import com.intellij.injected.editor.VirtualFileWindow;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.file.exclude.ProjectFileExclusionManager;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
@@ -41,6 +42,7 @@ public class ProjectFileIndexImpl implements ProjectFileIndex {
private final FileTypeManager myFileTypeManager;
private final DirectoryIndex myDirectoryIndex;
private final ContentFilter myContentFilter;
private final ProjectFileExclusionManager myFileExclusionManager;
public ProjectFileIndexImpl(Project project, DirectoryIndex directoryIndex, FileTypeManager fileTypeManager) {
myProject = project;
@@ -48,6 +50,7 @@ public class ProjectFileIndexImpl implements ProjectFileIndex {
myDirectoryIndex = directoryIndex;
myFileTypeManager = fileTypeManager;
myContentFilter = new ContentFilter();
myFileExclusionManager = ProjectFileExclusionManager.getInstance(project);
}
public boolean iterateContent(@NotNull ContentIterator iterator) {
@@ -88,6 +91,7 @@ public class ProjectFileIndexImpl implements ProjectFileIndex {
public boolean isIgnored(@NotNull VirtualFile file) {
if (myFileTypeManager.isFileIgnored(file)) return true;
if (myFileExclusionManager.isExcluded(file)) return true;
VirtualFile dir = file.isDirectory() ? file : file.getParent();
if (dir == null) return false;
@@ -242,6 +246,7 @@ public class ProjectFileIndexImpl implements ProjectFileIndex {
return info != null && info.module != null;
}
else {
if (myFileExclusionManager.isExcluded(file)) return false;
return !myFileTypeManager.isFileIgnored(file);
}
}
@@ -22,6 +22,7 @@ import com.intellij.openapi.command.undo.UndoManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.file.exclude.ProjectFileExclusionManager;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
import com.intellij.openapi.fileTypes.*;
@@ -63,6 +64,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
private volatile Content myContent;
private volatile SoftReference<Document> myDocument;
private final Language myBaseLanguage;
private final ProjectFileExclusionManager myExclusionManager;
public SingleRootFileViewProvider(@NotNull PsiManager manager, @NotNull VirtualFile file) {
this(manager, file, true);
@@ -81,6 +83,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
myPhysical = isEventSystemEnabled() &&
!(virtualFile instanceof LightVirtualFile) &&
!(virtualFile.getFileSystem() instanceof DummyFileSystem);
myExclusionManager = ProjectFileExclusionManager.getInstance(manager.getProject());
}
@NotNull
@@ -234,6 +237,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
protected boolean isIgnored() {
final VirtualFile file = getVirtualFile();
if (file instanceof LightVirtualFile) return false;
if (myExclusionManager.isExcluded(file)) return true;
return FileTypeManager.getInstance().isFileIgnored(file);
}
@@ -23,6 +23,7 @@ import com.intellij.ide.caches.CacheUpdater;
import com.intellij.ide.caches.FileContent;
import com.intellij.ide.startup.StartupManagerEx;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.file.exclude.ProjectFileExclusionManager;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
@@ -40,12 +41,14 @@ public class FileBasedIndexProjectHandler extends AbstractProjectComponent imple
private final FileBasedIndex myIndex;
private final ProjectRootManagerEx myRootManager;
private final FileTypeManager myFileTypeManager;
private final ProjectFileExclusionManager myExclusionManager;
public FileBasedIndexProjectHandler(final FileBasedIndex index, final Project project, final ProjectRootManagerEx rootManager, FileTypeManager ftManager, final ProjectManager projectManager) {
super(project);
myIndex = index;
myRootManager = rootManager;
myFileTypeManager = ftManager;
myExclusionManager = ProjectFileExclusionManager.getInstance(project);
final StartupManagerEx startupManager = (StartupManagerEx)StartupManager.getInstance(project);
if (startupManager != null) {
@@ -73,6 +76,7 @@ public class FileBasedIndexProjectHandler extends AbstractProjectComponent imple
public boolean isInSet(final VirtualFile file) {
final ProjectFileIndex index = myRootManager.getFileIndex();
if (index.isInContent(file) || index.isInLibraryClasses(file) || index.isInLibrarySource(file)) {
if (myExclusionManager.isExcluded(file)) return false;
return !myFileTypeManager.isFileIgnored(file);
}
return false;
@@ -18,7 +18,6 @@ package com.intellij.openapi.fileTypes;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.CachedSingletonsRegistry;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -115,23 +114,8 @@ public abstract class FileTypeManager{
public abstract boolean isFileIgnored(@NonNls @NotNull String name);
/**
* @param file The file to be checked.
* @return true if the file is ignored, false otherwise.
* @deprecated A preferred method is {@link FileTypeManager#isFileIgnored(com.intellij.openapi.project.Project, com.intellij.openapi.vfs.VirtualFile)}
*/
public abstract boolean isFileIgnored(@NonNls @NotNull VirtualFile file);
/**
* Checkes if the file is to be ignored within a given project.
* @param project The project containing the file to check.
* @param file The file to to be checked.
* @return true if the file is ignored, false otherwise.
*/
public boolean isFileIgnored(@Nullable Project project, @NotNull VirtualFile file) {
return isFileIgnored(file);
}
/**
* Returns the list of extensions associated with the specified file type.
*
@@ -1,68 +0,0 @@
/*
* 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 com.intellij.openapi.file.exclude;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.Nullable;
/**
* @author Rustam Vishnyakov
*/
public abstract class FileExclusionProvider {
public static ExtensionPointName<FileExclusionProvider> EP_NAME = ExtensionPointName.create("com.intellij.fileExclusionProvider");
public static ExtensionPointName<FileExclusionProvider> PROJECT_EP_NAME =
ExtensionPointName.create("com.intellij.projectFileExclusionProvider");
public boolean isFileExcluded(final VirtualFile file) {
return false;
}
public boolean isFileNameExcluded(final String name) {
return false;
}
public static boolean isExcluded(final @Nullable Project project, final VirtualFile file) {
if (file.isDirectory()) return false;
for (FileExclusionProvider exclusionProvider : Extensions.getExtensions(EP_NAME)) {
if (exclusionProvider.isFileExcluded(file)) return true;
}
if (project != null) {
for (FileExclusionProvider exclusionProvider : Extensions.getExtensions(PROJECT_EP_NAME, project)) {
if (exclusionProvider.isFileExcluded(file)) return true;
}
}
else {
for (Project openProject : ProjectManager.getInstance().getOpenProjects()) {
assert openProject != null;
if(isExcluded(openProject, file)) return true;
}
}
return false;
}
public static boolean isExcluded (final String fileName) {
for (FileExclusionProvider exclusionProvider : Extensions.getExtensions(EP_NAME)) {
if (exclusionProvider.isFileNameExcluded(fileName)) return true;
}
return false;
}
}
@@ -25,14 +25,12 @@ import com.intellij.openapi.components.ExportableApplicationComponent;
import com.intellij.openapi.components.RoamingType;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.file.exclude.FileExclusionProvider;
import com.intellij.openapi.fileTypes.*;
import com.intellij.openapi.fileTypes.ex.*;
import com.intellij.openapi.options.BaseSchemeProcessor;
import com.intellij.openapi.options.ExternalInfo;
import com.intellij.openapi.options.SchemesManager;
import com.intellij.openapi.options.SchemesManagerFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -377,17 +375,12 @@ public class FileTypeManagerImpl extends FileTypeManagerEx implements NamedJDOME
}
public boolean isFileIgnored(@NotNull String name) {
return myIgnoredPatterns.isIgnored(name) || FileExclusionProvider.isExcluded(name);
}
@Override
public boolean isFileIgnored(@Nullable Project project, @NonNls @NotNull VirtualFile file) {
return isFileIgnored(file.getName()) || FileExclusionProvider.isExcluded(project, file);
return myIgnoredPatterns.isIgnored(name);
}
@Override
public boolean isFileIgnored(@NonNls @NotNull VirtualFile file) {
return isFileIgnored(file.getName()) || FileExclusionProvider.isExcluded(null, file);
return isFileIgnored(file.getName());
}
@SuppressWarnings({"deprecation"})
@@ -26,6 +26,7 @@ public class PlatformUtils {
public static final String RUBY_PREFIX = "Ruby";
public static final String PHP_PREFIX = "PhpStorm";
public static final String WEB_PREFIX = "WebStorm";
public static final String FLEX_PREFIX = "Flex";
private PlatformUtils() {
}
@@ -65,4 +66,8 @@ public class PlatformUtils {
public static boolean isWebStorm() {
return WEB_PREFIX.equals(getPlatformPrefix());
}
public static boolean isFlexIde() {
return FLEX_PREFIX.equals(getPlatformPrefix());
}
}
@@ -278,7 +278,6 @@
<applicationConfigurable instance="com.intellij.codeInsight.intention.impl.config.IntentionSettingsConfigurable" id="intentions"/>
<!-- File Exclusions -->
<projectFileExclusionProvider implementation="com.intellij.openapi.file.exclude.ProjectFileExclusionProvider"/>
<projectService serviceInterface="com.intellij.openapi.file.exclude.ProjectFileExclusionManager"
serviceImplementation="com.intellij.openapi.file.exclude.ProjectFileExclusionManager"/>
@@ -44,9 +44,6 @@
area="IDEA_PROJECT"/>
<extensionPoint name="customFileTypeFactory" interface="com.intellij.openapi.fileTypes.ex.CustomFileTypeFactory"/>
<extensionPoint name="fileTypeRegistrator" interface="com.intellij.ide.highlighter.FileTypeRegistrator"/>
<extensionPoint name="fileExclusionProvider" interface="com.intellij.openapi.file.exclude.FileExclusionProvider"/>
<extensionPoint name="projectFileExclusionProvider" interface="com.intellij.openapi.file.exclude.FileExclusionProvider"
area="IDEA_PROJECT"/>
<extensionPoint name="undoProvider" interface="com.intellij.openapi.command.impl.UndoProvider"/>
<extensionPoint name="projectUndoProvider" interface="com.intellij.openapi.command.impl.UndoProvider"
@@ -23,12 +23,12 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.compiler.generator.GroovyToJavaGenerator;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.refactoring.convertToJava.GroovyToJavaGenerator;
import java.util.ArrayList;
import java.util.List;
@@ -16,8 +16,10 @@
package org.jetbrains.plugins.groovy.compiler.generator;
import com.intellij.compiler.impl.CompilerUtil;
import com.intellij.compiler.impl.FileSetCompileScope;
import com.intellij.compiler.impl.TranslatingCompilerFilesMonitor;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.compiler.CompileContext;
@@ -25,38 +27,44 @@ import com.intellij.openapi.compiler.CompileScope;
import com.intellij.openapi.compiler.CompilerPaths;
import com.intellij.openapi.compiler.ex.CompileContextEx;
import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.Chunk;
import com.intellij.util.containers.CollectionFactory;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.compiler.GroovyCompilerBase;
import org.jetbrains.plugins.groovy.compiler.GroovyCompilerConfiguration;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.refactoring.GroovyNamesUtil;
import org.jetbrains.plugins.groovy.refactoring.convertToJava.GroovyToJavaGenerator;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.*;
/**
* @author peter
*/
public class GroovycStubGenerator extends GroovyCompilerBase {
private static Logger LOG = Logger.getInstance("#org.jetbrains.plugins.groovy.compiler.generator.GroovycStubGenerator");
public static final String GROOVY_STUBS = "groovyStubs";
@@ -103,8 +111,11 @@ public class GroovycStubGenerator extends GroovyCompilerBase {
}
@Override
protected void compileFiles(CompileContext compileContext, Module module,
final List<VirtualFile> toCompile, OutputSink sink, boolean tests) {
protected void compileFiles(CompileContext compileContext,
Module module,
final List<VirtualFile> toCompile,
OutputSink sink,
boolean tests) {
final File outDir = getStubOutput(module, tests);
outDir.mkdirs();
@@ -116,16 +127,17 @@ public class GroovycStubGenerator extends GroovyCompilerBase {
if (GroovyCompilerConfiguration.getInstance(myProject).isUseGroovycStubs()) {
runGroovycCompiler(compileContext, module, toCompile, true, tempOutput, sink, tests);
} else {
}
else {
ProgressIndicator indicator = compileContext.getProgressIndicator();
indicator.pushState();
try {
final GroovyToJavaGenerator generator = new GroovyToJavaGenerator(myProject, compileContext, toCompile);
final GroovyToJavaGenerator generator = new GroovyToJavaGenerator(myProject, toCompile, false);
for (int i = 0; i < toCompile.size(); i++) {
indicator.setFraction((double)i / toCompile.size());
final Collection<VirtualFile> stubFiles = generator.generateItems(toCompile.get(i), tempOutput);
final Collection<VirtualFile> stubFiles = generateItems(generator, toCompile.get(i), tempOutput, compileContext, myProject);
((CompileContextEx)compileContext).addScope(new FileSetCompileScope(stubFiles, new Module[]{module}));
}
}
@@ -188,4 +200,40 @@ public class GroovycStubGenerator extends GroovyCompilerBase {
return true;
}
public static Collection<VirtualFile> generateItems(final GroovyToJavaGenerator generator,
final VirtualFile item,
final VirtualFile outputRootDirectory,
CompileContext context,
final Project project) {
ProgressIndicator indicator = context.getProgressIndicator();
indicator.setText("Generating stubs for " + item.getName() + "...");
if (LOG.isDebugEnabled()) {
LOG.debug("Generating stubs for " + item.getName() + "...");
}
final Map<String, String> output = ApplicationManager.getApplication().runReadAction(new Computable<Map<String, String>>() {
public Map<String, String> compute() {
return generator.generateStubs((GroovyFile)PsiManager.getInstance(project).findFile(item));
}
});
return writeStubs(outputRootDirectory, output, item);
}
private static List<VirtualFile> writeStubs(VirtualFile outputRootDirectory, Map<String, String> output, VirtualFile src) {
final ArrayList<VirtualFile> stubs = CollectionFactory.arrayList();
for (String relativePath : output.keySet()) {
final File stubFile = new File(outputRootDirectory.getPath(), relativePath);
FileUtil.createIfDoesntExist(stubFile);
try {
FileUtil.writeToFile(stubFile, output.get(relativePath).getBytes(src.getCharset()));
}
catch (IOException e) {
LOG.error(e);
}
CompilerUtil.refreshIOFile(stubFile);
ContainerUtil.addIfNotNull(LocalFileSystem.getInstance().refreshAndFindFileByIoFile(stubFile), stubs);
}
return stubs;
}
}
@@ -24,6 +24,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
/**
* @author ilyas
@@ -35,6 +36,12 @@ public interface GrArgumentLabel extends GroovyPsiElement, PsiReference {
@NotNull
PsiElement getNameElement();
@Nullable
/**
* returns expression which is put into parentheses.
*/
GrExpression getExpression();
@Nullable
String getName();
@@ -236,6 +236,13 @@ public class GrArgumentLabelImpl extends GroovyPsiElementImpl implements GrArgum
return element;
}
@Override
public GrExpression getExpression() {
final PsiElement nameElement = getNameElement();
if (nameElement instanceof GrParenthesizedExpression) return ((GrParenthesizedExpression)nameElement).getOperand();
return null;
}
@Nullable
public PsiType getExpectedArgumentType() {
final PsiElement resolved = resolve();
@@ -13,20 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.groovy.compiler.generator;
package org.jetbrains.plugins.groovy.refactoring.convertToJava;
import com.intellij.codeInsight.generation.OverrideImplementUtil;
import com.intellij.compiler.impl.CompilerUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.compiler.CompileContext;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightMethodBuilder;
@@ -62,8 +57,6 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUt
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
import org.jetbrains.plugins.groovy.lang.psi.util.GrClassImplUtil;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
@@ -72,7 +65,7 @@ import java.util.*;
*/
public class GroovyToJavaGenerator {
private static final Map<String, String> typesToInitialValues = new HashMap<String, String>();
private static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.compiler.generator.GroovyToJavaGenerator");
private static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.refactoring.convertToJava.GroovyToJavaGenerator");
static {
typesToInitialValues.put("boolean", "false");
@@ -97,30 +90,15 @@ public class GroovyToJavaGenerator {
PsiModifier.NATIVE,
};
private final CompileContext myContext;
private final List<VirtualFile> myAllToCompile;
private final Project myProject;
public GroovyToJavaGenerator(Project project, CompileContext context, List<VirtualFile> allToCompile) {
private final boolean fullConversion;
public GroovyToJavaGenerator(Project project, List<VirtualFile> allToCompile, boolean fullConversion) {
myProject = project;
myContext = context;
myAllToCompile = allToCompile;
}
public Collection<VirtualFile> generateItems(final VirtualFile item, final VirtualFile outputRootDirectory) {
ProgressIndicator indicator = myContext.getProgressIndicator();
indicator.setText("Generating stubs for " + item.getName() + "...");
if (LOG.isDebugEnabled()) {
LOG.debug("Generating stubs for " + item.getName() + "...");
}
final Map<String, String> output = ApplicationManager.getApplication().runReadAction(new Computable<Map<String, String>>() {
public Map<String, String> compute() {
return generateStubs((GroovyFile)PsiManager.getInstance(myProject).findFile(item));
}
});
return writeStubs(outputRootDirectory, output, item);
this.fullConversion = fullConversion;
}
public Map<String, String> generateStubs(GroovyFile file) {
@@ -157,23 +135,6 @@ public class GroovyToJavaGenerator {
return output;
}
private static List<VirtualFile> writeStubs(VirtualFile outputRootDirectory, Map<String, String> output, VirtualFile src) {
final ArrayList<VirtualFile> stubs = CollectionFactory.arrayList();
for (String relativePath : output.keySet()) {
final File stubFile = new File(outputRootDirectory.getPath(), relativePath);
FileUtil.createIfDoesntExist(stubFile);
try {
FileUtil.writeToFile(stubFile, output.get(relativePath).getBytes(src.getCharset()));
}
catch (IOException e) {
LOG.error(e);
}
CompilerUtil.refreshIOFile(stubFile);
ContainerUtil.addIfNotNull(LocalFileSystem.getInstance().refreshAndFindFileByIoFile(stubFile), stubs);
}
return stubs;
}
private static String getPackageDirectory(@Nullable GrPackageDefinition packageDefinition) {
if (packageDefinition == null) return "";
@@ -596,7 +557,7 @@ public class GroovyToJavaGenerator {
return method.getText();
}
final GroovyToJavaGenerator generator = new GroovyToJavaGenerator(method.getProject(), null, Collections.<VirtualFile>emptyList());
final GroovyToJavaGenerator generator = new GroovyToJavaGenerator(method.getProject(), Collections.<VirtualFile>emptyList(), false);
final StringBuffer buffer = new StringBuffer();
if (method instanceof GrConstructor) {
generator.writeConstructor(buffer, (GrConstructor)method, false, false);
@@ -3,8 +3,8 @@ package org.jetbrains.plugins.groovy.compiler;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiFile;
import org.jetbrains.plugins.groovy.LightGroovyTestCase;
import org.jetbrains.plugins.groovy.compiler.generator.GroovyToJavaGenerator;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.refactoring.convertToJava.GroovyToJavaGenerator;
import org.jetbrains.plugins.groovy.util.TestUtils;
import java.util.Arrays;
@@ -103,7 +103,7 @@ public class GeneratorTest extends LightGroovyTestCase {
final String testName = StringUtil.trimEnd(relTestPath, ".test");
PsiFile psiFile = TestUtils.createPseudoPhysicalFile(getProject(), testName + ".groovy", data.get(0));
final Map<String,String> map =
new GroovyToJavaGenerator(getProject(), null, Arrays.asList(psiFile.getViewProvider().getVirtualFile()))
new GroovyToJavaGenerator(getProject(), Arrays.asList(psiFile.getViewProvider().getVirtualFile()), false)
.generateStubs((GroovyFile)psiFile);
for (String stubText : map.values()) {