diff --git a/colorSchemes/src/colorSchemes/vibrant_ink.xml b/colorSchemes/src/colorSchemes/vibrant_ink.xml index 5317b6ccb193..e8e73e74fb95 100644 --- a/colorSchemes/src/colorSchemes/vibrant_ink.xml +++ b/colorSchemes/src/colorSchemes/vibrant_ink.xml @@ -1,31 +1,32 @@ - + + @@ -387,13 +388,13 @@ @@ -404,7 +405,7 @@ @@ -416,12 +417,12 @@ + + + + + + + + + + + + + + + + + + + @@ -539,8 +639,8 @@ + @@ -786,7 +889,7 @@ - - - - @@ -907,52 +990,14 @@ - - - - - - - - @@ -976,71 +1016,55 @@ - - - @@ -1971,18 +1995,18 @@ @@ -2012,12 +2036,12 @@ diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index 28b06f5eb07d..b7caf23314a2 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -636,7 +636,9 @@ public class CompileDriver { if (useExtProcessBuild) { // ensure the project model seen by build process is up-to-date myProject.save(); - ApplicationManager.getApplication().saveSettings(); + if (!ApplicationManager.getApplication().isUnitTestMode()) { + ApplicationManager.getApplication().saveSettings(); + } } PsiDocumentManager.getInstance(myProject).commitAllDocuments(); FileDocumentManager.getInstance().saveAllDocuments(); diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index fb9a68331a81..0957ead53e61 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -16,7 +16,6 @@ package com.intellij.compiler.server; import com.intellij.ProjectTopics; -import com.intellij.application.options.PathMacrosImpl; import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.compiler.impl.javaCompiler.javac.JavacConfiguration; import com.intellij.compiler.server.impl.CompileServerClasspathManager; @@ -215,8 +214,6 @@ public class BuildManager implements ApplicationComponent{ private final ChannelGroup myAllOpenChannels = new DefaultChannelGroup("build-manager"); private final BuildMessageDispatcher myMessageDispatcher = new BuildMessageDispatcher(); private volatile int myListenPort = -1; - private volatile CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings myGlobals; - private int myGlobalsStamp = -1; @Nullable private final Charset mySystemCharset; @@ -376,7 +373,6 @@ public class BuildManager implements ApplicationComponent{ } public void clearState(Project project) { - myGlobals = null; final String projectPath = getProjectPath(project); synchronized (myProjectDataMap) { final ProjectData data = myProjectDataMap.get(projectPath); @@ -539,7 +535,10 @@ public class BuildManager implements ApplicationComponent{ return; } - final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals = buildGlobalSettings(); + final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals = + CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.newBuilder() + .setGlobalOptionsPath(PathManager.getOptionsPath()) + .build(); CmdlineRemoteProto.Message.ControllerMessage.FSEvent currentFSChanges; final SequentialTaskExecutor projectTaskQueue; synchronized (myProjectDataMap) { @@ -688,47 +687,6 @@ public class BuildManager implements ApplicationComponent{ return "com.intellij.compiler.server.BuildManager"; } - private CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings buildGlobalSettings() { - final PathMacrosImpl pathVars = PathMacrosImpl.getInstanceEx(); - - final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings cached = myGlobals; - if (cached != null && myGlobalsStamp == pathVars.getModificationStamp()) { - return cached; - } - myGlobals = null; // ensure the cache is cleared and stamp is current - myGlobalsStamp = pathVars.getModificationStamp(); - - final Map data = new HashMap(); - - for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { - data.put(entry.getKey(), FileUtil.toSystemIndependentName(entry.getValue())); - } - - for (String name : pathVars.getAllMacroNames()) { - final String path = pathVars.getValue(name); - if (path != null) { - data.put(name, FileUtil.toSystemIndependentName(path)); - } - } - - final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.Builder cmdBuilder = - CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.newBuilder(); - - cmdBuilder.setGlobalOptionsPath(PathManager.getOptionsPath()); - - if (!data.isEmpty()) { - for (Map.Entry entry : data.entrySet()) { - final String var = entry.getKey(); - final String value = entry.getValue(); - if (var != null && value != null) { - cmdBuilder.addPathVariable(CmdlineProtoUtil.createPair(var, value)); - } - } - } - - return myGlobals = cmdBuilder.build(); - } - private OSProcessHandler launchBuildProcess(Project project, final int port, final UUID sessionId) throws ExecutionException { final String compilerPath; final String vmExecutablePath; diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java index 01a6c14c14ec..5761e27f93c4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/StackFrameProxyImpl.java @@ -28,6 +28,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.sun.jdi.*; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -172,18 +173,23 @@ public class StackFrameProxyImpl extends JdiProxy implements StackFrameProxy { } } + @Nullable public ObjectReference thisObject() throws EvaluateException { DebuggerManagerThreadImpl.assertIsManagerThread(); checkValid(); try { - if(myThisReference == null) { - myThisReference = getStackFrame().thisObject(); + for (int attempt = 0; attempt < 2; attempt++) { + try { + if(myThisReference == null) { + myThisReference = getStackFrame().thisObject(); + } + break; + } + catch (InvalidStackFrameException e) { + clearCaches(); + } } } - catch (InvalidStackFrameException e) { - clearCaches(); - return thisObject(); - } catch (InternalException e) { // supress some internal errors caused by bugs in specific JDI implementations if(e.errorCode() != 23) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 7d97295b8bab..1a9ecda975ae 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -707,7 +707,10 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } else { - myHolder.add(HighlightNamesUtil.highlightMethodName(method, element, false, colorsScheme)); + final PsiElement referenceNameElement = element.getReferenceNameElement(); + if(referenceNameElement != null) { + myHolder.add(HighlightNamesUtil.highlightMethodName(method, referenceNameElement, false, colorsScheme)); + } } } catch (IndexNotReadyException ignored) { diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 0a92e0091f18..2f6b65045bd4 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -35,14 +35,9 @@ import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; -import static com.intellij.psi.CommonClassNames.JAVA_LANG_ERROR; -import static com.intellij.psi.CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION; -import static com.intellij.psi.CommonClassNames.JAVA_LANG_THROWABLE; +import static com.intellij.psi.CommonClassNames.*; class ControlFlowAnalyzer extends JavaElementVisitor { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer"); @@ -91,7 +86,9 @@ class ControlFlowAnalyzer extends JavaElementVisitor { pass2Flow.setFields(myFields.toArray(new DfaVariableValue[myFields.size()])); - LOG.assertTrue(myPass1Flow.getInstructionCount() == pass2Flow.getInstructionCount()); + if (myPass1Flow.getInstructionCount() != pass2Flow.getInstructionCount()) { + LOG.error(Arrays.toString(myPass1Flow.getInstructions()) + "!=\n" + Arrays.toString(pass2Flow.getInstructions())); + } addInstruction(new ReturnInstruction()); diff --git a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java index 3c584077122e..8697b8b37558 100644 --- a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java +++ b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java @@ -18,8 +18,6 @@ package com.intellij.openapi.options.colors.pages; import com.intellij.application.options.colors.InspectionColorSettingsPage; import com.intellij.ide.highlighter.JavaFileHighlighter; import com.intellij.ide.highlighter.JavaHighlightingColors; -import com.intellij.openapi.editor.HighlighterColors; -import com.intellij.openapi.editor.SyntaxHighlighterColors; import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileTypes.StdFileTypes; @@ -181,7 +179,7 @@ public class JavaColorSettingsPage implements ColorSettingsPage, InspectionColor " int a = localVar;\n" + " }\n" + " };\n" + - " reassignedParam = new int[2];\n" + + " reassignedParam = new ArrayList<String>().toArray(new int[0]);\n" + " }\n" + "}\n" + "enum AnEnum { CONST1, CONST2 }\n"+ diff --git a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java index d4f579084216..8a2ed8be9d12 100644 --- a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java +++ b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java @@ -33,9 +33,11 @@ import org.jetbrains.annotations.Nullable; public class PsiClassConverter extends Converter implements CustomReferenceConverter { public PsiClass fromString(final String s, final ConvertContext context) { + if (StringUtil.isEmptyOrSpaces(s)) return null; + final DomElement element = context.getInvocationElement(); final GlobalSearchScope scope = element instanceof GenericDomValue ? getScope(context) : null; - return DomJavaUtil.findClass(s, context.getFile(), context.getModule(), scope); + return DomJavaUtil.findClass(s.trim(), context.getFile(), context.getModule(), scope); } @Nullable diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java index d55918700adc..60afa034b88c 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java @@ -32,11 +32,9 @@ import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.file.PsiPackageImpl; import com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Query; import com.intellij.util.containers.ConcurrentHashMap; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NonNls; @@ -130,15 +128,13 @@ public abstract class JavaFileManagerBase implements JavaFileManager, Disposable @Override public PsiClass[] findClasses(@NotNull String qName, @NotNull final GlobalSearchScope scope) { - final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); + final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); if (classes.isEmpty()) return PsiClass.EMPTY_ARRAY; List result = new ArrayList(classes.size()); int count = 0; PsiClass aClass = null; - for (PsiElement found : classes) { - if (notClass(found)) continue; - - aClass = (PsiClass)found; + for (PsiClass found : classes) { + aClass = found; final String qualifiedName = aClass.getQualifiedName(); if (qualifiedName == null || !qualifiedName.equals(qName)) continue; @@ -277,12 +273,9 @@ public abstract class JavaFileManagerBase implements JavaFileManager, Disposable private PsiClass findClassInIndex(String qName, GlobalSearchScope scope) { VirtualFile bestFile = null; PsiClass bestClass = null; - final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); + final Collection classes = JavaFullClassNameIndex.getInstance().get(qName.hashCode(), myManager.getProject(), scope); - for (PsiElement found : classes) { - if (notClass(found)) continue; - - PsiClass aClass = (PsiClass)found; + for (PsiClass aClass : classes) { PsiFile file = aClass.getContainingFile(); if (file == null) { LOG.error("aClass=" + aClass); @@ -346,18 +339,6 @@ public abstract class JavaFileManagerBase implements JavaFileManager, Disposable return myNontrivialPackagePrefixes; } - private static boolean notClass(final PsiElement found) { - if (found instanceof PsiClass) return false; - - VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(found); - LOG.error("Non class in class list: " + faultyContainer + ". found: " + found); - if (faultyContainer != null && faultyContainer.isValid()) { - FileBasedIndex.getInstance().requestReindex(faultyContainer); - } - - return true; - } - @Nullable private static PsiClass findClassByName(PsiJavaFile scope, String name) { PsiClass[] classes = scope.getClasses(); diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java index fbf4508682b3..03c8c3e2e1f3 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java @@ -24,7 +24,9 @@ import com.intellij.psi.PsiAnnotation; import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; +import com.intellij.psi.stubs.StubIndex; import com.intellij.psi.stubs.StubIndexKey; +import com.intellij.psi.stubs.StubProcessingHelperBase; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -44,6 +46,6 @@ public class JavaAnnotationIndex extends StringStubIndexExtension @Override public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { - return super.get(s, project, new JavaSourceFilterScope(scope)); + return StubIndex.getInstance().safeGet(getKey(), s, project, new JavaSourceFilterScope(scope), PsiAnnotation.class); } } \ No newline at end of file diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java index 40c75f3551b3..a4f4c156b98d 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.IntStubIndexExtension; +import com.intellij.psi.stubs.StubIndex; import com.intellij.psi.stubs.StubIndexKey; import org.jetbrains.annotations.NotNull; @@ -44,6 +45,6 @@ public class JavaFullClassNameIndex extends IntStubIndexExtension { @Override public Collection get(final Integer integer, final Project project, @NotNull final GlobalSearchScope scope) { - return super.get(integer, project, new JavaSourceFilterScope(scope)); + return StubIndex.getInstance().safeGet(getKey(), integer, project, new JavaSourceFilterScope(scope), PsiClass.class); } } \ No newline at end of file diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java index a4aa95266d53..cc0ac6d48761 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java @@ -3,7 +3,6 @@ package com.intellij.psi.impl.search; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; @@ -11,13 +10,12 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.AnnotatedElementsSearch; -import com.intellij.psi.util.PsiUtilCore; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; -import com.intellij.util.indexing.FileBasedIndex; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -43,46 +41,32 @@ public class AnnotatedElementsSearcher implements QueryExecutor[] types = p.getTypes(); + final Class[] types = p.getTypes(); - for (PsiElement elt : getAnnotationCandidates(annClass, useScope)) { - if (notAnnotation(elt)) continue; - - final PsiAnnotation ann = (PsiAnnotation)elt; - final PsiJavaCodeReferenceElement ref = ApplicationManager.getApplication().runReadAction(new Computable() { + for (final PsiAnnotation ann : getAnnotationCandidates(annClass, useScope)) { + final PsiModifierListOwner candidate = ApplicationManager.getApplication().runReadAction(new Computable() { @Override - public PsiJavaCodeReferenceElement compute() { - return ann.getNameReferenceElement(); + public PsiModifierListOwner compute() { + PsiElement parent = ann.getParent(); + if (!(parent instanceof PsiModifierList)) { + return null; // Can be a PsiNameValuePair, if annotation is used to annotate annotation parameters + } + + final PsiElement owner = parent.getParent(); + if (!isInstanceof(owner, types)) { + return null; + } + + final PsiJavaCodeReferenceElement ref = ann.getNameReferenceElement(); + if (ref == null || !psiManager.areElementsEquivalent(ref.resolve(), annClass)) { + return null; + } + + return (PsiModifierListOwner)owner; } }); - if (ref == null) continue; - PsiElement parent = ann.getParent(); - if (!(parent instanceof PsiModifierList)) continue; // Can be a PsiNameValuePair, if annotation is used to annotate annotation parameters - - final PsiElement owner = parent.getParent(); - - if (!isInstanceof(owner, types)) continue; - - final PsiModifierListOwner candidate = (PsiModifierListOwner)owner; - - if (!ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public Boolean compute() { - if (!candidate.isValid()) { - return false; - } - if (!psiManager.areElementsEquivalent(ref.resolve(), annClass)) { - return false; - } - return !(useScope instanceof GlobalSearchScope) || - ((GlobalSearchScope)useScope).contains(candidate.getContainingFile().getVirtualFile()); - } - })) { - continue; - } - - if (!consumer.process(candidate)) { + if (candidate != null && !consumer.process(candidate)) { return false; } } @@ -90,23 +74,17 @@ public class AnnotatedElementsSearcher implements QueryExecutor getAnnotationCandidates(final PsiClass annClass, final SearchScope useScope) { - return ApplicationManager.getApplication().runReadAction(new Computable>() { + private static Collection getAnnotationCandidates(final PsiClass annClass, final SearchScope useScope) { + return ApplicationManager.getApplication().runReadAction(new Computable>() { @Override - public Collection compute() { + public Collection compute() { if (useScope instanceof GlobalSearchScope) { return JavaAnnotationIndex.getInstance().get(annClass.getName(), annClass.getProject(), (GlobalSearchScope)useScope); } - final List result = new ArrayList(); + + final List result = ContainerUtil.newArrayList(); for (PsiElement element : ((LocalSearchScope)useScope).getScope()) { - element.accept(new PsiRecursiveElementWalkingVisitor() { - @Override - public void visitElement(PsiElement element) { - if (element instanceof PsiAnnotation) { - result.add(element); - } - } - }); + result.addAll(PsiTreeUtil.findChildrenOfType(element, PsiAnnotation.class)); } return result; } @@ -120,15 +98,4 @@ public class AnnotatedElementsSearcher implements QueryExecutor result = null; - for(PsiElement child = reference.getFirstChild(); child != null; child = child.getNextSibling()){ + for (PsiElement child = reference.getFirstChild(); child != null; child = child.getNextSibling()) { if (child instanceof PsiAnnotation) { if (result == null) result = new SmartList(); result.add((PsiAnnotation)child); } } - - if (result == null) return PsiAnnotation.EMPTY_ARRAY; - return result.toArray(new PsiAnnotation[result.size()]); - } - - public PsiClassReferenceType(@NotNull PsiJavaCodeReferenceElement reference, LanguageLevel languageLevel, PsiAnnotation[] annotations) { - super(languageLevel,annotations); - myReference = reference; + return result == null ? PsiAnnotation.EMPTY_ARRAY : result.toArray(new PsiAnnotation[result.size()]); } @Override @@ -84,7 +82,7 @@ public class PsiClassReferenceType extends PsiClassType { @Override public PsiClassType setLanguageLevel(@NotNull final LanguageLevel languageLevel) { if (languageLevel.equals(myLanguageLevel)) return this; - return new PsiClassReferenceType(myReference,languageLevel,getAnnotations()); + return new PsiClassReferenceType(myReference, languageLevel, getAnnotations()); } @Override @@ -158,9 +156,9 @@ public class PsiClassReferenceType extends PsiClassType { } String qualifiedName = myReference.getQualifiedName(); String name = myReference.getReferenceName(); - if (name==null) name=""; + if (name == null) name = ""; LightClassReference reference = new LightClassReference(myReference.getManager(), name, qualifiedName, myReference.getResolveScope()); - return new PsiClassReferenceType(reference, null,getAnnotations()); + return new PsiClassReferenceType(reference, null, getAnnotations()); } @Override @@ -175,9 +173,9 @@ public class PsiClassReferenceType extends PsiClassType { } public PsiClassType createImmediateCopy() { - final ClassResolveResult resolveResult = resolveGenerics(); - if (resolveResult.getElement() == null) return this; - return new PsiImmediateClassType(resolveResult.getElement(), resolveResult.getSubstitutor()); + ClassResolveResult resolveResult = resolveGenerics(); + PsiClass element = resolveResult.getElement(); + return element != null ? new PsiImmediateClassType(element, resolveResult.getSubstitutor()) : this; } @Override diff --git a/jps/jps-builders/proto/cmdline_remote_proto.proto b/jps/jps-builders/proto/cmdline_remote_proto.proto index 4023ca6d823c..3310a3b53b7c 100644 --- a/jps/jps-builders/proto/cmdline_remote_proto.proto +++ b/jps/jps-builders/proto/cmdline_remote_proto.proto @@ -42,7 +42,6 @@ message Message { } message GlobalSettings { - repeated KeyValuePair path_variable = 1; required string global_options_path = 5; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java index 4d7b8cb35bdb..22e8f1658ddd 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java @@ -1,19 +1,3 @@ -/* - * Copyright 2000-2012 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. - */ - // Generated by the protocol buffer compiler. DO NOT EDIT! // source: cmdline_remote_proto.proto @@ -1966,12 +1950,6 @@ public final class CmdlineRemoteProto { public interface GlobalSettingsOrBuilder extends com.google.protobuf.MessageLiteOrBuilder { - // repeated .org.jetbrains.jpsservice.Message.KeyValuePair path_variable = 1; - java.util.List - getPathVariableList(); - org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair getPathVariable(int index); - int getPathVariableCount(); - // required string global_options_path = 5; boolean hasGlobalOptionsPath(); String getGlobalOptionsPath(); @@ -1995,27 +1973,6 @@ public final class CmdlineRemoteProto { } private int bitField0_; - // repeated .org.jetbrains.jpsservice.Message.KeyValuePair path_variable = 1; - public static final int PATH_VARIABLE_FIELD_NUMBER = 1; - private java.util.List pathVariable_; - public java.util.List getPathVariableList() { - return pathVariable_; - } - public java.util.List - getPathVariableOrBuilderList() { - return pathVariable_; - } - public int getPathVariableCount() { - return pathVariable_.size(); - } - public org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair getPathVariable(int index) { - return pathVariable_.get(index); - } - public org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePairOrBuilder getPathVariableOrBuilder( - int index) { - return pathVariable_.get(index); - } - // required string global_options_path = 5; public static final int GLOBAL_OPTIONS_PATH_FIELD_NUMBER = 5; private java.lang.Object globalOptionsPath_; @@ -2049,7 +2006,6 @@ public final class CmdlineRemoteProto { } private void initFields() { - pathVariable_ = java.util.Collections.emptyList(); globalOptionsPath_ = ""; } private byte memoizedIsInitialized = -1; @@ -2061,12 +2017,6 @@ public final class CmdlineRemoteProto { memoizedIsInitialized = 0; return false; } - for (int i = 0; i < getPathVariableCount(); i++) { - if (!getPathVariable(i).isInitialized()) { - memoizedIsInitialized = 0; - return false; - } - } memoizedIsInitialized = 1; return true; } @@ -2074,9 +2024,6 @@ public final class CmdlineRemoteProto { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); - for (int i = 0; i < pathVariable_.size(); i++) { - output.writeMessage(1, pathVariable_.get(i)); - } if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeBytes(5, getGlobalOptionsPathBytes()); } @@ -2088,10 +2035,6 @@ public final class CmdlineRemoteProto { if (size != -1) return size; size = 0; - for (int i = 0; i < pathVariable_.size(); i++) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(1, pathVariable_.get(i)); - } if (((bitField0_ & 0x00000001) == 0x00000001)) { size += com.google.protobuf.CodedOutputStream .computeBytesSize(5, getGlobalOptionsPathBytes()); @@ -2198,10 +2141,8 @@ public final class CmdlineRemoteProto { public Builder clear() { super.clear(); - pathVariable_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); globalOptionsPath_ = ""; - bitField0_ = (bitField0_ & ~0x00000002); + bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -2235,12 +2176,7 @@ public final class CmdlineRemoteProto { org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings result = new org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings(this); int from_bitField0_ = bitField0_; int to_bitField0_ = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - pathVariable_ = java.util.Collections.unmodifiableList(pathVariable_); - bitField0_ = (bitField0_ & ~0x00000001); - } - result.pathVariable_ = pathVariable_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { to_bitField0_ |= 0x00000001; } result.globalOptionsPath_ = globalOptionsPath_; @@ -2250,16 +2186,6 @@ public final class CmdlineRemoteProto { public Builder mergeFrom(org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings other) { if (other == org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings.getDefaultInstance()) return this; - if (!other.pathVariable_.isEmpty()) { - if (pathVariable_.isEmpty()) { - pathVariable_ = other.pathVariable_; - bitField0_ = (bitField0_ & ~0x00000001); - } else { - ensurePathVariableIsMutable(); - pathVariable_.addAll(other.pathVariable_); - } - - } if (other.hasGlobalOptionsPath()) { setGlobalOptionsPath(other.getGlobalOptionsPath()); } @@ -2271,12 +2197,6 @@ public final class CmdlineRemoteProto { return false; } - for (int i = 0; i < getPathVariableCount(); i++) { - if (!getPathVariable(i).isInitialized()) { - - return false; - } - } return true; } @@ -2297,14 +2217,8 @@ public final class CmdlineRemoteProto { } break; } - case 10: { - org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder subBuilder = org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.newBuilder(); - input.readMessage(subBuilder, extensionRegistry); - addPathVariable(subBuilder.buildPartial()); - break; - } case 42: { - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000001; globalOptionsPath_ = input.readBytes(); break; } @@ -2314,99 +2228,10 @@ public final class CmdlineRemoteProto { private int bitField0_; - // repeated .org.jetbrains.jpsservice.Message.KeyValuePair path_variable = 1; - private java.util.List pathVariable_ = - java.util.Collections.emptyList(); - private void ensurePathVariableIsMutable() { - if (!((bitField0_ & 0x00000001) == 0x00000001)) { - pathVariable_ = new java.util.ArrayList(pathVariable_); - bitField0_ |= 0x00000001; - } - } - - public java.util.List getPathVariableList() { - return java.util.Collections.unmodifiableList(pathVariable_); - } - public int getPathVariableCount() { - return pathVariable_.size(); - } - public org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair getPathVariable(int index) { - return pathVariable_.get(index); - } - public Builder setPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair value) { - if (value == null) { - throw new NullPointerException(); - } - ensurePathVariableIsMutable(); - pathVariable_.set(index, value); - - return this; - } - public Builder setPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder builderForValue) { - ensurePathVariableIsMutable(); - pathVariable_.set(index, builderForValue.build()); - - return this; - } - public Builder addPathVariable(org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair value) { - if (value == null) { - throw new NullPointerException(); - } - ensurePathVariableIsMutable(); - pathVariable_.add(value); - - return this; - } - public Builder addPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair value) { - if (value == null) { - throw new NullPointerException(); - } - ensurePathVariableIsMutable(); - pathVariable_.add(index, value); - - return this; - } - public Builder addPathVariable( - org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder builderForValue) { - ensurePathVariableIsMutable(); - pathVariable_.add(builderForValue.build()); - - return this; - } - public Builder addPathVariable( - int index, org.jetbrains.jps.api.CmdlineRemoteProto.Message.KeyValuePair.Builder builderForValue) { - ensurePathVariableIsMutable(); - pathVariable_.add(index, builderForValue.build()); - - return this; - } - public Builder addAllPathVariable( - java.lang.Iterable values) { - ensurePathVariableIsMutable(); - super.addAll(values, pathVariable_); - - return this; - } - public Builder clearPathVariable() { - pathVariable_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); - - return this; - } - public Builder removePathVariable(int index) { - ensurePathVariableIsMutable(); - pathVariable_.remove(index); - - return this; - } - // required string global_options_path = 5; private java.lang.Object globalOptionsPath_ = ""; public boolean hasGlobalOptionsPath() { - return ((bitField0_ & 0x00000002) == 0x00000002); + return ((bitField0_ & 0x00000001) == 0x00000001); } public String getGlobalOptionsPath() { java.lang.Object ref = globalOptionsPath_; @@ -2422,19 +2247,19 @@ public final class CmdlineRemoteProto { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000001; globalOptionsPath_ = value; return this; } public Builder clearGlobalOptionsPath() { - bitField0_ = (bitField0_ & ~0x00000002); + bitField0_ = (bitField0_ & ~0x00000001); globalOptionsPath_ = getDefaultInstance().getGlobalOptionsPath(); return this; } void setGlobalOptionsPath(com.google.protobuf.ByteString value) { - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000001; globalOptionsPath_ = value; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java index 1c6edbf86772..14a12542d300 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildRunner.java @@ -104,7 +104,7 @@ public class BuildRunner { targetsState = new BuildTargetsState(dataPaths, jpsModel, buildRootIndex); projectTimestamps = new ProjectTimestamps(dataStorageRoot, targetsState); dataManager = new BuildDataManager(dataPaths, targetsState, STORE_TEMP_CACHES_IN_MEMORY); - // second attempt succeded + // second attempt succeeded msgHandler.processMessage(new CompilerMessage("build", BuildMessage.Kind.INFO, "Project rebuild forced: " + e.getMessage())); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index e8e20e1b5d61..e638739b6cda 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -61,11 +61,11 @@ final class BuildSession implements Runnable, CanceledStatus { private final UUID mySessionId; private final Channel myChannel; private volatile boolean myCanceled = false; - private String myProjectPath; + private final String myProjectPath; @Nullable private CmdlineRemoteProto.Message.ControllerMessage.FSEvent myInitialFSDelta; // state - private EventsProcessor myEventsProcessor = new EventsProcessor(); + private final EventsProcessor myEventsProcessor = new EventsProcessor(); private volatile long myLastEventOrdinal; private volatile ProjectDescriptor myProjectDescriptor; private final Map, ConstantSearchFuture> mySearchTasks = Collections.synchronizedMap(new HashMap, ConstantSearchFuture>()); @@ -81,14 +81,7 @@ final class BuildSession implements Runnable, CanceledStatus { mySessionId = sessionId; myChannel = channel; - // globals - Map pathVars = new HashMap(); final CmdlineRemoteProto.Message.ControllerMessage.GlobalSettings globals = params.getGlobalSettings(); - for (CmdlineRemoteProto.Message.KeyValuePair variable : globals.getPathVariableList()) { - pathVars.put(variable.getKey(), variable.getValue()); - } - - // session params myProjectPath = FileUtil.toCanonicalPath(params.getProjectId()); String globalOptionsPath = FileUtil.toCanonicalPath(globals.getGlobalOptionsPath()); myBuildType = convertCompileType(params.getBuildType()); @@ -99,7 +92,7 @@ final class BuildSession implements Runnable, CanceledStatus { builderParams.put(pair.getKey(), pair.getValue()); } myInitialFSDelta = delta; - JpsModelLoaderImpl loader = new JpsModelLoaderImpl(myProjectPath, globalOptionsPath, pathVars, null); + JpsModelLoaderImpl loader = new JpsModelLoaderImpl(myProjectPath, globalOptionsPath, null); myForceModelLoading = Boolean.parseBoolean(builderParams.get(BuildMain.FORCE_MODEL_LOADING_PARAMETER.toString())); myBuildRunner = new BuildRunner(loader, scopes, filePaths, builderParams); } @@ -304,7 +297,8 @@ final class BuildSession implements Runnable, CanceledStatus { } } - private void applyFSEvent(ProjectDescriptor pd, @Nullable CmdlineRemoteProto.Message.ControllerMessage.FSEvent event, final boolean saveEventStamp) throws IOException { + private static void applyFSEvent(ProjectDescriptor pd, @Nullable CmdlineRemoteProto.Message.ControllerMessage.FSEvent event, + final boolean saveEventStamp) throws IOException { if (event == null) { return; } @@ -369,7 +363,7 @@ final class BuildSession implements Runnable, CanceledStatus { } } - private void updateFsStateOnDisk(File dataStorageRoot, DataInputStream original, final long ordinal) { + private static void updateFsStateOnDisk(File dataStorageRoot, DataInputStream original, final long ordinal) { final File file = new File(dataStorageRoot, FS_STATE_FILE); try { final BufferExposingByteArrayOutputStream bytes = new BufferExposingByteArrayOutputStream(); @@ -462,8 +456,8 @@ final class BuildSession implements Runnable, CanceledStatus { } try { final File file = new File(dataStorageRoot, FS_STATE_FILE); - final InputStream fs = new FileInputStream(file); byte[] bytes; + final InputStream fs = new FileInputStream(file); try { bytes = FileUtil.loadBytes(fs, (int)file.length()); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java index a5499a4c8aae..66b8c31cf94c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoader.java @@ -17,9 +17,11 @@ package org.jetbrains.jps.cmdline; import org.jetbrains.jps.model.JpsModel; +import java.io.IOException; + /** * @author nik */ public interface JpsModelLoader { - JpsModel loadModel(); + JpsModel loadModel() throws IOException; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java index 0e84370d422c..5ad11fdaf8b6 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/JpsModelLoaderImpl.java @@ -17,14 +17,11 @@ package org.jetbrains.jps.cmdline; import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.ParameterizedRunnable; -import org.jetbrains.jps.model.JpsElementFactory; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsModel; -import org.jetbrains.jps.model.serialization.JpsGlobalLoader; -import org.jetbrains.jps.model.serialization.JpsProjectLoader; +import org.jetbrains.jps.model.serialization.JpsSerializationManager; -import java.io.File; import java.io.IOException; -import java.util.Map; /** * @author nik @@ -33,44 +30,25 @@ public class JpsModelLoaderImpl implements JpsModelLoader { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.cmdline.JpsModelLoaderImpl"); private final String myProjectPath; private final String myGlobalOptionsPath; - private final Map myPathVars; private final ParameterizedRunnable myModelInitializer; - public JpsModelLoaderImpl(String projectPath, String globalOptionsPath, Map pathVars, - ParameterizedRunnable initializer) { + public JpsModelLoaderImpl(String projectPath, String globalOptionsPath, @Nullable ParameterizedRunnable initializer) { myProjectPath = projectPath; myGlobalOptionsPath = globalOptionsPath; - myPathVars = pathVars; myModelInitializer = initializer; } @Override - public JpsModel loadModel() { + public JpsModel loadModel() throws IOException { final long start = System.currentTimeMillis(); - try { - final JpsModel model = JpsElementFactory.getInstance().createModel(); - try { - if (myGlobalOptionsPath != null) { - JpsGlobalLoader.loadGlobalSettings(model.getGlobal(), myPathVars, myGlobalOptionsPath); - } - JpsProjectLoader.loadProject(model.getProject(), myPathVars, myProjectPath); - if (myModelInitializer != null) { - myModelInitializer.run(model); - } - LOG.info("New JPS model: " + model.getProject().getModules().size() + " modules, " + model.getProject().getLibraryCollection().getLibraries().size() + " libraries"); - } - catch (IOException e) { - LOG.info(e); - } - return model; + LOG.info("Loading model: project path = " + myProjectPath + ", global options path = " + myGlobalOptionsPath); + final JpsModel model = JpsSerializationManager.getInstance().loadModel(myProjectPath, myGlobalOptionsPath); + if (myModelInitializer != null) { + myModelInitializer.run(model); } - finally { - final long loadTime = System.currentTimeMillis() - start; - LOG.info("New JPS model: project " + myProjectPath + " loaded in " + loadTime + " ms"); - } - } - - private static boolean isDirectoryBased(File projectFile) { - return !(projectFile.isFile() && projectFile.getName().endsWith(".ipr")); + final long loadTime = System.currentTimeMillis() - start; + LOG.info("Model loaded in " + loadTime + " ms"); + LOG.info("Project has " + model.getProject().getModules().size() + " modules, " + model.getProject().getLibraryCollection().getLibraries().size() + " libraries"); + return model; } } diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java deleted file mode 100644 index 582e35bfc8aa..000000000000 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetListener.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2000-2012 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.jps.model.module; - -import java.util.EventListener; - -/** - * @author nik - */ -public interface JpsFacetListener extends EventListener { - void facetAdded(JpsFacet facet); - void facetRemoved(JpsFacet facet); -} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetReference.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetReference.java deleted file mode 100644 index f4754b45242c..000000000000 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetReference.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2000-2012 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.jps.model.module; - -import org.jetbrains.jps.model.JpsElementReference; - -/** - * @author nik - */ -public interface JpsFacetReference extends JpsElementReference { -} diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java index 668b4f18c372..e11ca1c0fc18 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java +++ b/jps/model-api/src/org/jetbrains/jps/model/module/JpsModule.java @@ -54,13 +54,6 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement - JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType

type, @NotNull P properties); - - @NotNull - List getFacets(); - JpsDependenciesList getDependenciesList(); @NotNull diff --git a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java index d497455e0fd9..53586eb77737 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/artifact/impl/JpsArtifactRole.java @@ -23,10 +23,10 @@ import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; * @author nik */ public class JpsArtifactRole extends JpsElementChildRoleBase { - public static final JpsArtifactRole INSTANCE = new JpsArtifactRole(); + private static final JpsArtifactRole INSTANCE = new JpsArtifactRole(); public static final JpsElementCollectionRole ARTIFACT_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - public JpsArtifactRole() { + private JpsArtifactRole() { super("artifact"); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java index 7226b3854069..e36362b50dd8 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsEventDispatcherBase.java @@ -29,7 +29,7 @@ import java.util.Map; * @author nik */ public abstract class JpsEventDispatcherBase implements JpsEventDispatcher { - private Map, EventDispatcher> myDispatchers = new HashMap, EventDispatcher>(); + private final Map, EventDispatcher> myDispatchers = new HashMap, EventDispatcher>(); @NotNull @Override diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java index 315347621526..bd3a59974979 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsCompilerExcludesImpl.java @@ -41,11 +41,11 @@ public class JpsCompilerExcludesImpl implements JpsCompilerExcludes { addExcludedDirectory(JpsPathUtil.urlToFile(url), recursively); } - public void addExcludedFile(File file) { + protected void addExcludedFile(File file) { myFiles.add(file); } - public void addExcludedDirectory(File dir, boolean recursively) { + protected void addExcludedDirectory(File dir, boolean recursively) { (recursively ? myRecursivelyExcludedDirectories : myDirectories).add(dir); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java index dfebfa2ce83c..dbf5eac3529f 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/JpsJavaCompilerConfigurationImpl.java @@ -36,13 +36,13 @@ public class JpsJavaCompilerConfigurationImpl extends JpsCompositeElementBase ROLE = JpsElementChildRoleBase.create("compiler configuration"); private boolean myAddNotNullAssertions = true; private boolean myClearOutputDirectoryOnRebuild = true; - private JpsCompilerExcludes myCompilerExcludes = new JpsCompilerExcludesImpl(); - private List myResourcePatterns = new ArrayList(); - private List myAnnotationProcessingProfiles = new ArrayList(); - private ProcessorConfigProfileImpl myDefaultAnnotationProcessingProfile = new ProcessorConfigProfileImpl("Default"); + private final JpsCompilerExcludes myCompilerExcludes = new JpsCompilerExcludesImpl(); + private final List myResourcePatterns = new ArrayList(); + private final List myAnnotationProcessingProfiles = new ArrayList(); + private final ProcessorConfigProfileImpl myDefaultAnnotationProcessingProfile = new ProcessorConfigProfileImpl("Default"); private String myProjectByteCodeTargetLevel; - private Map myModulesByteCodeTargetLevels = new HashMap(); - private Map myCompilerOptions = new HashMap(); + private final Map myModulesByteCodeTargetLevels = new HashMap(); + private final Map myCompilerOptions = new HashMap(); private String myJavaCompilerId = "Javac"; private Map myAnnotationProcessingProfileMap; private ResourcePatterns myCompiledPatterns; diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java index ed62fa4e6561..f1273621f823 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/compiler/ResourcePatterns.java @@ -160,7 +160,7 @@ public class ResourcePatterns { return wildcardPattern; } - public static boolean isPatternNegated(String wildcardPattern) { + private static boolean isPatternNegated(String wildcardPattern) { return wildcardPattern.length() > 1 && wildcardPattern.charAt(0) == '!'; } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java index 1c1492058878..0da1aadbfee1 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryRole.java @@ -26,7 +26,7 @@ import org.jetbrains.jps.model.library.JpsLibraryListener; * @author nik */ public class JpsLibraryRole extends JpsElementChildRoleBase { - public static final JpsLibraryRole INSTANCE = new JpsLibraryRole(); + private static final JpsLibraryRole INSTANCE = new JpsLibraryRole(); public static final JpsElementCollectionRole LIBRARIES_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); private JpsLibraryRole() { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java deleted file mode 100644 index 9822b5b40dcd..000000000000 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2000-2012 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.jps.model.module.impl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsElement; -import org.jetbrains.jps.model.JpsElementChildRole; -import org.jetbrains.jps.model.JpsElementCollection; -import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; -import org.jetbrains.jps.model.ex.JpsNamedCompositeElementBase; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetReference; -import org.jetbrains.jps.model.module.JpsFacetType; -import org.jetbrains.jps.model.module.JpsModule; - -/** - * @author nik - */ -public class JpsFacetImpl extends JpsNamedCompositeElementBase implements JpsFacet { - private static final JpsElementChildRole PARENT_FACET_REFERENCE = JpsElementChildRoleBase.create("parent facet"); - private final JpsFacetType myFacetType; - - public

JpsFacetImpl(JpsFacetType facetType, @NotNull String name, @NotNull P properties) { - super(name); - myFacetType = facetType; - myContainer.setChild(JpsFacetRole.COLLECTION_ROLE); - } - - private JpsFacetImpl(JpsFacetImpl original) { - super(original); - myFacetType = original.myFacetType; - } - - @NotNull - @Override - public JpsFacetImpl createCopy() { - return new JpsFacetImpl(this); - } - - @Override - @NotNull - public JpsFacetType getType() { - return myFacetType; - } - - @Override - public void setParentFacet(@NotNull JpsFacet facet) { - myContainer.setChild(PARENT_FACET_REFERENCE, facet.createReference()); - } - - @Override - @Nullable - public JpsFacet getParentFacet() { - final JpsFacetReference reference = myContainer.getChild(PARENT_FACET_REFERENCE); - return reference != null ? reference.resolve() : null; - } - - @Override - public JpsModule getModule() { - return myParent != null ? (JpsModule)myParent.getParent() : null; - } - - @NotNull - @Override - public JpsFacetReference createReference() { - return new JpsFacetReferenceImpl(getName(), getModule().createReference()); - } - - @Override - public void delete() { - //noinspection unchecked - ((JpsElementCollection)myParent).removeChild(this); - } -} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java deleted file mode 100644 index a1d9b3593ea0..000000000000 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2000-2012 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.jps.model.module.impl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.impl.JpsNamedElementReferenceImpl; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetReference; -import org.jetbrains.jps.model.module.JpsModuleReference; - -/** - * @author nik - */ -public class JpsFacetReferenceImpl extends JpsNamedElementReferenceImpl implements JpsFacetReference { - public JpsFacetReferenceImpl(String facetName, JpsModuleReference moduleReference) { - super(JpsFacetRole.COLLECTION_ROLE, facetName, moduleReference); - } - - private JpsFacetReferenceImpl(JpsFacetReferenceImpl original) { - super(original); - } - - @NotNull - @Override - public JpsFacetReferenceImpl createCopy() { - return new JpsFacetReferenceImpl(this); - } -} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetRole.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetRole.java deleted file mode 100644 index d59044b60f16..000000000000 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetRole.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2000-2012 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.jps.model.module.impl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsEventDispatcher; -import org.jetbrains.jps.model.ex.JpsElementCollectionRole; -import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetListener; - -/** - * @author nik - */ -public class JpsFacetRole extends JpsElementChildRoleBase { - public static final JpsFacetRole INSTANCE = new JpsFacetRole(); - public static final JpsElementCollectionRole COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - - public JpsFacetRole() { - super("facet"); - } - - @Override - public void fireElementAdded(@NotNull JpsEventDispatcher dispatcher, @NotNull JpsFacet element) { - dispatcher.getPublisher(JpsFacetListener.class).facetAdded(element); - } - - @Override - public void fireElementRemoved(@NotNull JpsEventDispatcher dispatcher, @NotNull JpsFacet element) { - dispatcher.getPublisher(JpsFacetListener.class).facetRemoved(element); - } -} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java index 847affcb3219..68fa7674ebda 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java @@ -40,7 +40,7 @@ import java.util.List; public class JpsModuleImpl

extends JpsNamedCompositeElementBase> implements JpsTypedModule

{ private static final JpsUrlListRole CONTENT_ROOTS_ROLE = new JpsUrlListRole("content roots"); private static final JpsUrlListRole EXCLUDED_ROOTS_ROLE = new JpsUrlListRole("excluded roots"); - public static final JpsElementChildRole DEPENDENCIES_LIST_CHILD_ROLE = JpsElementChildRoleBase.create("dependencies"); + private static final JpsElementChildRole DEPENDENCIES_LIST_CHILD_ROLE = JpsElementChildRoleBase.create("dependencies"); private final JpsModuleType

myModuleType; private final JpsLibraryCollection myLibraryCollection; @@ -50,7 +50,6 @@ public class JpsModuleImpl

extends JpsNamedCompositeElemen myContainer.setChild(myModuleType.getPropertiesRole(), properties); myContainer.setChild(CONTENT_ROOTS_ROLE); myContainer.setChild(EXCLUDED_ROOTS_ROLE); - myContainer.setChild(JpsFacetRole.COLLECTION_ROLE); myContainer.setChild(DEPENDENCIES_LIST_CHILD_ROLE, new JpsDependenciesListImpl()); getDependenciesList().addModuleSourceDependency(); myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryRole.LIBRARIES_COLLECTION_ROLE)); @@ -136,18 +135,6 @@ public class JpsModuleImpl

extends JpsNamedCompositeElemen } } - @NotNull - @Override - public

JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType

type, @NotNull P properties) { - return myContainer.getChild(JpsFacetRole.COLLECTION_ROLE).addChild(new JpsFacetImpl(type, name, properties)); - } - - @NotNull - @Override - public List getFacets() { - return myContainer.getChild(JpsFacetRole.COLLECTION_ROLE).getElements(); - } - @NotNull @Override public JpsDependenciesList getDependenciesList() { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java index a55659ee85c4..54e9e6ae023d 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleRole.java @@ -27,10 +27,10 @@ import org.jetbrains.jps.model.module.JpsModuleListener; * @author nik */ public class JpsModuleRole extends JpsElementChildRoleBase { - public static final JpsElementChildRole INSTANCE = new JpsModuleRole(); + private static final JpsElementChildRole INSTANCE = new JpsModuleRole(); public static final JpsElementCollectionRole MODULE_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - public JpsModuleRole() { + private JpsModuleRole() { super("module"); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java index d3f087a0722f..be9d2fc20c14 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleSourceRootRole.java @@ -26,10 +26,10 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootListener; * @author nik */ public class JpsModuleSourceRootRole extends JpsElementChildRoleBase { - public static final JpsModuleSourceRootRole INSTANCE = new JpsModuleSourceRootRole(); + private static final JpsModuleSourceRootRole INSTANCE = new JpsModuleSourceRootRole(); public static final JpsElementCollectionRole ROOT_COLLECTION_ROLE = JpsElementCollectionRole.create(INSTANCE); - public JpsModuleSourceRootRole() { + private JpsModuleSourceRootRole() { super("module source root"); } diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java deleted file mode 100644 index 7c1f7ae95ea7..000000000000 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsFacetTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2012 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.jps.model; - -import org.jetbrains.jps.model.java.JpsJavaModuleType; -import org.jetbrains.jps.model.module.JpsFacet; -import org.jetbrains.jps.model.module.JpsFacetType; -import org.jetbrains.jps.model.module.JpsModule; - -/** - * @author nik - */ -public class JpsFacetTest extends JpsModelTestCase { - public void testAddFacet() { - final JpsModule m = myProject.addModule("m", JpsJavaModuleType.INSTANCE); - m.addFacet("f", MY_FACET_TYPE, JpsElementFactory.getInstance().createDummyElement()); - assertEquals("f", assertOneElement(m.getFacets()).getName()); - } - - public void testCreateReferenceByFacet() { - final JpsFacet facet = myProject.addModule("m", JpsJavaModuleType.INSTANCE).addFacet("f", MY_FACET_TYPE, JpsElementFactory.getInstance().createDummyElement()); - final JpsElementReference reference = facet.createReference().asExternal(myModel); - assertSame(facet, reference.resolve()); - } - - private static final JpsFacetType MY_FACET_TYPE = new JpsFacetType() { }; -} diff --git a/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsSerializationManager b/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsSerializationManager new file mode 100644 index 000000000000..5fa4b3ae61cd --- /dev/null +++ b/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsSerializationManager @@ -0,0 +1 @@ +org.jetbrains.jps.model.serialization.impl.JpsSerializationManagerImpl \ No newline at end of file diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java index 3c13de8f85a0..db81ab260124 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementExtensionSerializerBase.java @@ -24,8 +24,8 @@ import org.jetbrains.jps.model.JpsElement; * @author nik */ public abstract class JpsElementExtensionSerializerBase { - protected final String myConfigFileName; - protected final String myComponentName; + private final String myConfigFileName; + private final String myComponentName; protected JpsElementExtensionSerializerBase(@Nullable String configFileName, @NotNull String componentName) { myComponentName = componentName; diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java new file mode 100644 index 000000000000..eee77c804894 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalElementSaver.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2013 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.jps.model.serialization; + +import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.SystemProperties; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jetbrains.jps.model.JpsGlobal; + +import java.io.File; +import java.io.IOException; + +/** + * @author nik + */ +public class JpsGlobalElementSaver { + private static final JpsGlobalExtensionSerializer[] SERIALIZERS = { + new JpsGlobalLoader.PathVariablesSerializer(), new JpsGlobalLoader.GlobalLibrariesSerializer(), new JpsGlobalLoader.SdkTableSerializer() + }; + private final JpsGlobal myGlobal; + + public JpsGlobalElementSaver(JpsGlobal global) { + myGlobal = global; + } + + public static void saveGlobalElement(JpsGlobal global, String optionsPath) throws IOException { + File optionsDir = new File(FileUtil.toCanonicalPath(optionsPath)); + new JpsGlobalElementSaver(global).save(optionsDir); + } + + private void save(File optionsDir) throws IOException { + for (JpsGlobalExtensionSerializer serializer : SERIALIZERS) { + saveGlobalComponents(serializer, optionsDir); + } + } + + private void saveGlobalComponents(JpsGlobalExtensionSerializer serializer, File optionsDir) throws IOException { + String fileName = serializer.getConfigFileName(); + File configFile = new File(optionsDir, fileName != null ? fileName : "other.xml"); + Element rootElement = loadOrCreateRootElement(configFile); + serializer.saveExtension(myGlobal, JDomSerializationUtil.findOrCreateComponentElement(rootElement, serializer.getComponentName())); + JDOMUtil.writeDocument(new Document(rootElement), configFile, SystemProperties.getLineSeparator()); + } + + private static Element loadOrCreateRootElement(File configFile) { + if (!configFile.exists()) { + return new Element("application"); + } + try { + return JDOMUtil.loadDocument(configFile).getRootElement(); + } + catch (JDOMException e) { + throw new RuntimeException(e); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java index aa6950dcf063..2679adf5bc9a 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java @@ -16,20 +16,22 @@ package org.jetbrains.jps.model.serialization; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElementChildRole; -import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.JpsGlobal; -import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; +import org.jetbrains.jps.model.serialization.impl.JpsPathVariablesConfigurationImpl; import org.jetbrains.jps.model.serialization.library.JpsLibraryTableSerializer; import org.jetbrains.jps.model.serialization.library.JpsSdkTableSerializer; import java.io.File; import java.io.IOException; +import java.util.Collections; import java.util.Map; /** @@ -38,28 +40,29 @@ import java.util.Map; public class JpsGlobalLoader extends JpsLoaderBase { private static final Logger LOG = Logger.getInstance(JpsGlobalLoader.class); public static final String SDK_TABLE_COMPONENT_NAME = "ProjectJdkTable"; - private static final JpsElementChildRole>> PATH_VARIABLES_ROLE = JpsElementChildRoleBase.create("path variables"); + public static final JpsElementChildRole PATH_VARIABLES_ROLE = JpsElementChildRoleBase.create("path variables"); private static final JpsGlobalExtensionSerializer[] SERIALIZERS = { new GlobalLibrariesSerializer(), new SdkTableSerializer(), new FileTypesSerializer() }; public static final String FILE_TYPES_COMPONENT_NAME_KEY = "jps.file.types.component.name"; private final JpsGlobal myGlobal; - public JpsGlobalLoader(JpsGlobal global, Map pathVariables) { + private JpsGlobalLoader(JpsGlobal global, Map pathVariables) { super(new JpsMacroExpander(pathVariables)); myGlobal = global; - global.getContainer().setChild(PATH_VARIABLES_ROLE, JpsElementFactory.getInstance().createSimpleElement(pathVariables)); } - public static void loadGlobalSettings(JpsGlobal global, Map pathVariables, String optionsPath) throws IOException { + public static void loadGlobalSettings(JpsGlobal global, String optionsPath) throws IOException { File optionsDir = new File(FileUtil.toCanonicalPath(optionsPath)); + new JpsGlobalLoader(global, Collections.emptyMap()).loadGlobalComponents(optionsDir, new PathVariablesSerializer()); + Map pathVariables = JpsModelSerializationDataService.getAllPathVariables(global); new JpsGlobalLoader(global, pathVariables).load(optionsDir); } @Nullable public static String getPathVariable(JpsGlobal global, String name) { - JpsSimpleElement> child = global.getContainer().getChild(PATH_VARIABLES_ROLE); - return child != null ? child.getData().get(name) : null; + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getPathVariablesConfiguration(global); + return configuration != null ? configuration.getPathVariable(name) : null; } private void load(File optionsDir) { @@ -78,8 +81,43 @@ public class JpsGlobalLoader extends JpsLoaderBase { loadComponents(optionsDir, "other.xml", serializer, myGlobal); } - private static class GlobalLibrariesSerializer extends JpsGlobalExtensionSerializer { - private GlobalLibrariesSerializer() { + public static class PathVariablesSerializer extends JpsGlobalExtensionSerializer { + public static final String MACRO_TAG = "macro"; + public static final String NAME_ATTRIBUTE = "name"; + public static final String VALUE_ATTRIBUTE = "value"; + + public PathVariablesSerializer() { + super("path.macros.xml", "PathMacrosImpl"); + } + + @Override + public void loadExtension(@NotNull JpsGlobal global, @NotNull Element componentTag) { + JpsPathVariablesConfiguration configuration = global.getContainer().setChild(PATH_VARIABLES_ROLE, new JpsPathVariablesConfigurationImpl()); + for (Element macroTag : JDOMUtil.getChildren(componentTag, MACRO_TAG)) { + String name = macroTag.getAttributeValue(NAME_ATTRIBUTE); + String value = macroTag.getAttributeValue(VALUE_ATTRIBUTE); + if (name != null && value != null) { + configuration.addPathVariable(name, StringUtil.trimEnd(FileUtil.toSystemIndependentName(value), "/")); + } + } + } + + @Override + public void saveExtension(@NotNull JpsGlobal global, @NotNull Element componentTag) { + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getPathVariablesConfiguration(global); + if (configuration != null) { + for (Map.Entry entry : configuration.getAllVariables().entrySet()) { + Element tag = new Element(MACRO_TAG); + tag.setAttribute(NAME_ATTRIBUTE, entry.getKey()); + tag.setAttribute(VALUE_ATTRIBUTE, entry.getValue()); + componentTag.addContent(tag); + } + } + } + } + + public static class GlobalLibrariesSerializer extends JpsGlobalExtensionSerializer { + public GlobalLibrariesSerializer() { super("applicationLibraries.xml", "libraryTable"); } @@ -94,8 +132,8 @@ public class JpsGlobalLoader extends JpsLoaderBase { } } - private static class SdkTableSerializer extends JpsGlobalExtensionSerializer { - private SdkTableSerializer() { + public static class SdkTableSerializer extends JpsGlobalExtensionSerializer { + public SdkTableSerializer() { super("jdk.table.xml", SDK_TABLE_COMPONENT_NAME); } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java index a19e607f9161..e35bbb81717c 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java @@ -15,10 +15,8 @@ */ package org.jetbrains.jps.model.serialization; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import org.jdom.Element; import org.jdom.JDOMException; @@ -31,7 +29,6 @@ import java.io.IOException; * @author nik */ public abstract class JpsLoaderBase { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.model.serialization.JpsLoaderBase"); private final JpsMacroExpander myMacroExpander; protected JpsLoaderBase(JpsMacroExpander macroExpander) { diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java index 07efe413868c..927bf8b32631 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializationDataService.java @@ -17,18 +17,46 @@ package org.jetbrains.jps.model.serialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsGlobal; import org.jetbrains.jps.model.JpsProject; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.serialization.impl.JpsModuleSerializationDataExtensionImpl; +import org.jetbrains.jps.model.serialization.impl.JpsPathVariablesConfigurationImpl; import org.jetbrains.jps.model.serialization.impl.JpsProjectSerializationDataExtensionImpl; import org.jetbrains.jps.model.serialization.module.JpsModuleSerializationDataExtension; import java.io.File; +import java.util.HashMap; +import java.util.Map; /** * @author nik */ public class JpsModelSerializationDataService { + @NotNull + public static Map getAllPathVariables(JpsGlobal global) { + Map pathVariables = new HashMap(PathMacroUtil.getGlobalSystemMacros()); + JpsPathVariablesConfiguration configuration = getPathVariablesConfiguration(global); + if (configuration != null) { + pathVariables.putAll(configuration.getAllVariables()); + } + return pathVariables; + } + + @Nullable + public static JpsPathVariablesConfiguration getPathVariablesConfiguration(JpsGlobal global) { + return global.getContainer().getChild(JpsGlobalLoader.PATH_VARIABLES_ROLE); + } + + @NotNull + public static JpsPathVariablesConfiguration getOrCreatePathVariablesConfiguration(JpsGlobal global) { + JpsPathVariablesConfiguration child = global.getContainer().getChild(JpsGlobalLoader.PATH_VARIABLES_ROLE); + if (child == null) { + return global.getContainer().setChild(JpsGlobalLoader.PATH_VARIABLES_ROLE, new JpsPathVariablesConfigurationImpl()); + } + return child; + } + @Nullable public static JpsProjectSerializationDataExtension getProjectExtension(@NotNull JpsProject project) { diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsPathVariablesConfiguration.java similarity index 55% rename from jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java rename to jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsPathVariablesConfiguration.java index 4ae5adc90d5d..06917a5eef22 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacetType.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsPathVariablesConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -13,14 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.jps.model.module; +package org.jetbrains.jps.model.serialization; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; +import java.util.Map; + /** * @author nik */ -//todo[nik] I'm not sure that we really need separate interface for facets in the project model. -//Perhaps facets should be replaced by extensions for module elements -public abstract class JpsFacetType

{ +public interface JpsPathVariablesConfiguration extends JpsElement { + void addPathVariable(@NotNull String name, @NotNull String value); + + void removePathVariable(@NotNull String name); + + @Nullable + String getPathVariable(@NotNull String name); + + @NotNull + Map getAllVariables(); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java similarity index 50% rename from jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java rename to jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java index e4fac75ac921..cb08c6ca80e2 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/module/JpsFacet.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSerializationManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -13,33 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.jps.model.module; +package org.jetbrains.jps.model.serialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsNamedElement; -import org.jetbrains.jps.model.JpsReferenceableElement; +import org.jetbrains.jps.model.JpsGlobal; +import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.service.JpsServiceManager; + +import java.io.IOException; /** * @author nik */ -//todo[nik] I'm not sure that we really need separate interface for facets in the project model. -//Perhaps facets should be replaced by extensions for module elements -public interface JpsFacet extends JpsNamedElement, JpsReferenceableElement { - - JpsModule getModule(); +public abstract class JpsSerializationManager { + public static JpsSerializationManager getInstance() { + return JpsServiceManager.getInstance().getService(JpsSerializationManager.class); + } @NotNull - JpsFacetType getType(); + public abstract JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath) + throws IOException; - void delete(); - - @NotNull - @Override - JpsFacetReference createReference(); - - void setParentFacet(@NotNull JpsFacet facet); - - @Nullable - JpsFacet getParentFacet(); + public abstract void saveGlobalSettings(@NotNull JpsGlobal global, @NotNull String optionsPath) throws IOException; } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java index be0e60712f53..9dbd5d07fe9f 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/PathMacroUtil.java @@ -15,10 +15,16 @@ */ package org.jetbrains.jps.model.serialization; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.SystemProperties; +import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.util.Map; /** * @author nik @@ -28,6 +34,7 @@ public class PathMacroUtil { @NonNls public static final String MODULE_DIR_MACRO_NAME = "MODULE_DIR"; @NonNls public static final String DIRECTORY_STORE_NAME = ".idea"; @NonNls public static final String APPLICATION_HOME_DIR = "APPLICATION_HOME_DIR"; + @NonNls public static final String USER_HOME_NAME = "USER_HOME"; @Nullable public static String getModuleDir(String moduleFilePath) { @@ -48,4 +55,15 @@ public class PathMacroUtil { } return moduleDir; } + + public static String getUserHome() { + return StringUtil.trimEnd(FileUtil.toSystemIndependentName(SystemProperties.getUserHome()), "/"); + } + + public static Map getGlobalSystemMacros() { + final Map map = new HashMap(); + map.put(APPLICATION_HOME_DIR, FileUtil.toSystemIndependentName(PathManager.getHomePath())); + map.put(USER_HOME_NAME, getUserHome()); + return map; + } } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsPathVariablesConfigurationImpl.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsPathVariablesConfigurationImpl.java new file mode 100644 index 000000000000..432073790f2d --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsPathVariablesConfigurationImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright 2000-2013 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.jps.model.serialization.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.ex.JpsElementBase; +import org.jetbrains.jps.model.serialization.JpsPathVariablesConfiguration; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author nik + */ +public class JpsPathVariablesConfigurationImpl extends JpsElementBase implements JpsPathVariablesConfiguration { + private Map myPathVariables; + + public JpsPathVariablesConfigurationImpl() { + myPathVariables = new LinkedHashMap(); + } + + private JpsPathVariablesConfigurationImpl(Map pathVariables) { + myPathVariables = new LinkedHashMap(pathVariables); + } + + @NotNull + @Override + public JpsPathVariablesConfigurationImpl createCopy() { + return new JpsPathVariablesConfigurationImpl(myPathVariables); + } + + @Override + public void applyChanges(@NotNull JpsPathVariablesConfigurationImpl modified) { + } + + @Override + public void addPathVariable(@NotNull String name, @NotNull String value) { + myPathVariables.put(name, value); + } + + @Override + public void removePathVariable(@NotNull String name) { + myPathVariables.remove(name); + } + + @Nullable + @Override + public String getPathVariable(@NotNull String name) { + return myPathVariables.get(name); + } + + @NotNull + @Override + public Map getAllVariables() { + return Collections.unmodifiableMap(myPathVariables); + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java new file mode 100644 index 000000000000..2971b8824b4b --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/impl/JpsSerializationManagerImpl.java @@ -0,0 +1,49 @@ +/* + * Copyright 2000-2013 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.jps.model.serialization.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsElementFactory; +import org.jetbrains.jps.model.JpsGlobal; +import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.serialization.*; + +import java.io.IOException; +import java.util.Map; + +/** + * @author nik + */ +public class JpsSerializationManagerImpl extends JpsSerializationManager { + @NotNull + @Override + public JpsModel loadModel(@NotNull String projectPath, @Nullable String optionsPath) + throws IOException { + JpsModel model = JpsElementFactory.getInstance().createModel(); + if (optionsPath != null) { + JpsGlobalLoader.loadGlobalSettings(model.getGlobal(), optionsPath); + } + Map pathVariables = JpsModelSerializationDataService.getAllPathVariables(model.getGlobal()); + JpsProjectLoader.loadProject(model.getProject(), pathVariables, projectPath); + return model; + } + + @Override + public void saveGlobalSettings(@NotNull JpsGlobal global, @NotNull String optionsPath) throws IOException { + JpsGlobalElementSaver.saveGlobalElement(global, optionsPath); + } +} diff --git a/jps/model-serialization/testData/config/options/path.macros.xml b/jps/model-serialization/testData/config/options/path.macros.xml new file mode 100644 index 000000000000..d1bbc09ab21a --- /dev/null +++ b/jps/model-serialization/testData/config/options/path.macros.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/jps/model-serialization/testData/config/optionsAfterChange/path.macros.xml b/jps/model-serialization/testData/config/optionsAfterChange/path.macros.xml new file mode 100644 index 000000000000..e919f6d2a9b9 --- /dev/null +++ b/jps/model-serialization/testData/config/optionsAfterChange/path.macros.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java index 98536ddde1a8..32f31d6eeacb 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java @@ -15,12 +15,11 @@ */ package org.jetbrains.jps.model.serialization; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.testFramework.PlatformTestUtil; import org.jdom.Element; -import org.jdom.JDOMException; import org.jetbrains.jps.model.JpsEncodingConfigurationService; import org.jetbrains.jps.model.library.JpsLibrary; -import org.jetbrains.jps.model.serialization.library.JpsSdkTableSerializer; import java.io.File; import java.io.IOException; @@ -32,7 +31,7 @@ import java.util.List; public class JpsGlobalSerializationTest extends JpsSerializationTestCase { private static final String OPTIONS_DIR = "jps/model-serialization/testData/config/options"; - public void testLoadSdks() { + public void testLoadSdksAndGlobalLibraries() { loadGlobalSettings(OPTIONS_DIR); final List libraries = myModel.getGlobal().getLibraryCollection().getLibraries(); assertEquals(3, libraries.size()); @@ -43,14 +42,53 @@ public class JpsGlobalSerializationTest extends JpsSerializationTestCase { assertEquals("1.6", sdk2.getName()); } - public void testSaveSdks() throws JDOMException, IOException { + public void testSaveSdksAndGlobalLibraries() { loadGlobalSettings(OPTIONS_DIR); - Element actual = new Element("component").setAttribute("name", "ProjectJdkTable"); - JpsSdkTableSerializer.saveSdks(myModel.getGlobal().getLibraryCollection(), actual); - File jdkTableFile = new File(getTestDataFileAbsolutePath(OPTIONS_DIR), "jdk.table.xml"); - JpsMacroExpander expander = new JpsMacroExpander(getPathVariables()); - Element expected = JDomSerializationUtil.findComponent(JpsLoaderBase.loadRootElement(jdkTableFile, expander), "ProjectJdkTable"); - PlatformTestUtil.assertElementsEqual(expected, actual); + File targetOptionsDir = saveGlobalSettings(); + File originalOptionsDir = new File(getTestDataFileAbsolutePath(OPTIONS_DIR)); + assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "jdk.table.xml"); + assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "applicationLibraries.xml"); + } + + private File saveGlobalSettings() { + try { + File targetOptionsDir = FileUtil.createTempDirectory("options", null); + JpsSerializationManager.getInstance().saveGlobalSettings(myModel.getGlobal(), targetOptionsDir.getAbsolutePath()); + return targetOptionsDir; + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void testLoadPathVariables() { + loadGlobalSettings(OPTIONS_DIR); + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getPathVariablesConfiguration(myModel.getGlobal()); + assertNotNull(configuration); + assertEquals("/home/nik/.m2/repository", configuration.getPathVariable("MAVEN_REPOSITORY")); + assertEquals(1, configuration.getAllVariables().size()); + } + + public void testSavePathVariables() { + loadGlobalSettings(OPTIONS_DIR); + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getOrCreatePathVariablesConfiguration(myModel.getGlobal()); + configuration.addPathVariable("TOMCAT_HOME", "/home/nik/applications/tomcat"); + + File targetOptionsDir = saveGlobalSettings(); + File originalOptionsDir = new File(getTestDataFileAbsolutePath(OPTIONS_DIR + "AfterChange")); + assertOptionsFilesEqual(originalOptionsDir, targetOptionsDir, "path.macros.xml"); + } + + private void assertOptionsFilesEqual(File originalOptionsDir, File targetOptionsDir, final String fileName) { + try { + JpsMacroExpander expander = new JpsMacroExpander(getPathVariables()); + Element expected = JpsLoaderBase.loadRootElement(new File(originalOptionsDir, fileName), expander); + Element actual = JpsLoaderBase.loadRootElement(new File(targetOptionsDir, fileName), expander); + PlatformTestUtil.assertElementsEqual(expected, actual); + } + catch (IOException e) { + throw new RuntimeException(e); + } } public void testLoadEncoding() { diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java index ccb003510295..b96dad8612d5 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsSerializationTestCase.java @@ -16,6 +16,7 @@ package org.jetbrains.jps.model.serialization; import com.intellij.application.options.PathMacrosImpl; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.VfsUtilCore; @@ -65,7 +66,11 @@ public abstract class JpsSerializationTestCase extends JpsModelTestCase { try { String optionsPath = getTestDataFileAbsolutePath(optionsDir); Map pathVariables = getPathVariables(); - JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), pathVariables, optionsPath); + JpsPathVariablesConfiguration configuration = JpsModelSerializationDataService.getOrCreatePathVariablesConfiguration(myModel.getGlobal()); + for (Map.Entry entry : pathVariables.entrySet()) { + configuration.addPathVariable(entry.getKey(), entry.getValue()); + } + JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), optionsPath); } catch (IOException e) { throw new RuntimeException(e); @@ -74,7 +79,7 @@ public abstract class JpsSerializationTestCase extends JpsModelTestCase { protected Map getPathVariables() { Map variables = new HashMap(); - variables.put(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, PathManagerEx.getHomePath(getClass())); + variables.put(PathMacrosImpl.APPLICATION_HOME_MACRO_NAME, PathManager.getHomePath()); variables.put(PathMacrosImpl.USER_HOME_MACRO_NAME, SystemProperties.getUserHome()); return variables; } diff --git a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java index ed66c43e7409..8c6de9834979 100644 --- a/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java +++ b/jps/standalone-builder/src/org/jetbrains/jps/build/Standalone.java @@ -114,9 +114,7 @@ public class Standalone { initializer = new GroovyModelInitializer(scriptFile); } - Map pathVars = new HashMap(); - pathVars.put("USER_HOME", System.getProperty("user.home")); - JpsModelLoaderImpl loader = new JpsModelLoaderImpl(projectPath, globalOptionsPath, pathVars, initializer); + JpsModelLoaderImpl loader = new JpsModelLoaderImpl(projectPath, globalOptionsPath, initializer); BuildType buildType = incremental ? BuildType.MAKE : BuildType.PROJECT_REBUILD; Set modulesSet = new HashSet(Arrays.asList(modules)); List artifactsList = Arrays.asList(artifacts); diff --git a/native/WinLauncher/WinLauncher/WinLauncher.cpp b/native/WinLauncher/WinLauncher/WinLauncher.cpp index 8c1fa3f0a858..0d4cf2154176 100644 --- a/native/WinLauncher/WinLauncher/WinLauncher.cpp +++ b/native/WinLauncher/WinLauncher/WinLauncher.cpp @@ -124,8 +124,8 @@ bool FindJVMInEnvVar(const char* envVarName, bool& result) else { char buf[_MAX_PATH]; - sprintf_s(buf, "The environment variable %s (with the value of %s) does not point to a valid JVM installation", - envVarValue, jvmPath); + sprintf_s(buf, "The environment variable %s (with the value of %s) does not point to a valid JVM installation.", + envVarName, envVarValue); MessageBoxA(NULL, buf, "Error Launching IntelliJ Platform", MB_OK); result = false; } @@ -553,7 +553,6 @@ bool CheckSingleInstance() { hFileMapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_MAPPING_SIZE, mappingName.c_str()); - hSingleInstanceWatcherThread = CreateThread(NULL, 0, SingleInstanceThread, NULL, 0, NULL); return true; } else @@ -704,6 +703,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, if (!LoadVMOptions()) return 1; if (!LoadJVMLibrary()) return 1; if (!CreateJVM()) return 1; + + hSingleInstanceWatcherThread = CreateThread(NULL, 0, SingleInstanceThread, NULL, 0, NULL); + if (!RunMainClass()) return 1; jvm->DestroyJavaVM(); @@ -716,3 +718,4 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, return 0; } + \ No newline at end of file diff --git a/native/WinLauncher/WinLauncher/WinLauncher.vcxproj b/native/WinLauncher/WinLauncher/WinLauncher.vcxproj index 6656ec535a2a..acbee35bbb63 100644 --- a/native/WinLauncher/WinLauncher/WinLauncher.vcxproj +++ b/native/WinLauncher/WinLauncher/WinLauncher.vcxproj @@ -64,7 +64,7 @@ true - C:\Java\jdk1.6.0_41\include;C:\Java\jdk1.6.0_41\include\win32;$(IncludePath) + C:\Java\jdk1.6.0_43\include;C:\Java\jdk1.6.0_43\include\win32;$(IncludePath) true @@ -72,7 +72,7 @@ false - C:\Java\jdk1.6.0_41\include;C:\Java\jdk1.6.0_41\include\win32;$(IncludePath) + C:\Java\jdk1.6.0_43\include;C:\Java\jdk1.6.0_43\include\win32;$(IncludePath) false diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java index 64b9dd179b45..da9e0c80e839 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java @@ -317,7 +317,12 @@ public class CompositeElement extends TreeElement { @NonNls String msg = ""; msg += ";\n changed=" + (startStamp != myModificationsCount); msg += ";\n buffer=" + text; - msg += ";\n this=" + this; + try { + msg += ";\n this=" + this; + } + catch (StackOverflowError e) { + msg += ";\n this.toString produces SOE"; + } int shitStart = textMatches(text, 0); msg += ";\n matches until " + shitStart; LeafElement leaf = findLeafElementAt(Math.abs(shitStart)); diff --git a/platform/icons/src/actions/GroupByModule.png b/platform/icons/src/actions/GroupByModule.png index 86a6b55ec88c..ec4d538e75c7 100644 Binary files a/platform/icons/src/actions/GroupByModule.png and b/platform/icons/src/actions/GroupByModule.png differ diff --git a/platform/icons/src/actions/GroupByModule@2x_dark.png b/platform/icons/src/actions/GroupByModule@2x_dark.png index 10d000d2b5f0..5d0053a73699 100644 Binary files a/platform/icons/src/actions/GroupByModule@2x_dark.png and b/platform/icons/src/actions/GroupByModule@2x_dark.png differ diff --git a/platform/icons/src/actions/GroupByModuleGroup.png b/platform/icons/src/actions/GroupByModuleGroup.png index 5a20447f8726..5f85a0158478 100644 Binary files a/platform/icons/src/actions/GroupByModuleGroup.png and b/platform/icons/src/actions/GroupByModuleGroup.png differ diff --git a/platform/icons/src/actions/GroupByModuleGroup@2x.png b/platform/icons/src/actions/GroupByModuleGroup@2x.png new file mode 100644 index 000000000000..c4ec30899cb1 Binary files /dev/null and b/platform/icons/src/actions/GroupByModuleGroup@2x.png differ diff --git a/platform/icons/src/actions/GroupByModuleGroup@2x_dark.png b/platform/icons/src/actions/GroupByModuleGroup@2x_dark.png new file mode 100644 index 000000000000..83a1a7b51e5a Binary files /dev/null and b/platform/icons/src/actions/GroupByModuleGroup@2x_dark.png differ diff --git a/platform/icons/src/actions/GroupByModuleGroup_dark.png b/platform/icons/src/actions/GroupByModuleGroup_dark.png new file mode 100644 index 000000000000..44ac32172b54 Binary files /dev/null and b/platform/icons/src/actions/GroupByModuleGroup_dark.png differ diff --git a/platform/icons/src/actions/GroupByPackage.png b/platform/icons/src/actions/GroupByPackage.png index 1a2d40c375a6..5bb3981cf3c2 100644 Binary files a/platform/icons/src/actions/GroupByPackage.png and b/platform/icons/src/actions/GroupByPackage.png differ diff --git a/platform/icons/src/actions/GroupByPackage@2x.png b/platform/icons/src/actions/GroupByPackage@2x.png new file mode 100644 index 000000000000..9a6c060042c9 Binary files /dev/null and b/platform/icons/src/actions/GroupByPackage@2x.png differ diff --git a/platform/icons/src/actions/GroupByPackage@2x_dark.png b/platform/icons/src/actions/GroupByPackage@2x_dark.png new file mode 100644 index 000000000000..bfe47ec26227 Binary files /dev/null and b/platform/icons/src/actions/GroupByPackage@2x_dark.png differ diff --git a/platform/icons/src/actions/GroupByPackage_dark.png b/platform/icons/src/actions/GroupByPackage_dark.png index 1d6a741854d2..367161333a11 100644 Binary files a/platform/icons/src/actions/GroupByPackage_dark.png and b/platform/icons/src/actions/GroupByPackage_dark.png differ diff --git a/platform/icons/src/actions/GroupByPrefix@2x.png b/platform/icons/src/actions/GroupByPrefix@2x.png index d602305eea68..8b2a4bb799c3 100644 Binary files a/platform/icons/src/actions/GroupByPrefix@2x.png and b/platform/icons/src/actions/GroupByPrefix@2x.png differ diff --git a/platform/icons/src/actions/GroupByPrefix@2x_dark.png b/platform/icons/src/actions/GroupByPrefix@2x_dark.png index e0d28fea3d58..b7a859e394b5 100644 Binary files a/platform/icons/src/actions/GroupByPrefix@2x_dark.png and b/platform/icons/src/actions/GroupByPrefix@2x_dark.png differ diff --git a/platform/icons/src/actions/back.png b/platform/icons/src/actions/back.png index db458a9fc89f..f33a6ad2cede 100644 Binary files a/platform/icons/src/actions/back.png and b/platform/icons/src/actions/back.png differ diff --git a/platform/icons/src/actions/cancel.png b/platform/icons/src/actions/cancel.png index 0df8623d59db..721c469e6172 100644 Binary files a/platform/icons/src/actions/cancel.png and b/platform/icons/src/actions/cancel.png differ diff --git a/platform/icons/src/actions/checkOut@2x.png b/platform/icons/src/actions/checkOut@2x.png index 1f6cc9bbfce9..f195cabbff59 100644 Binary files a/platform/icons/src/actions/checkOut@2x.png and b/platform/icons/src/actions/checkOut@2x.png differ diff --git a/platform/icons/src/actions/checkOut_dark.png b/platform/icons/src/actions/checkOut_dark.png index 81f15cdeea9e..1cbfafa0756e 100644 Binary files a/platform/icons/src/actions/checkOut_dark.png and b/platform/icons/src/actions/checkOut_dark.png differ diff --git a/platform/icons/src/actions/clean.png b/platform/icons/src/actions/clean.png index 54696daae2fc..6444138e5fcd 100644 Binary files a/platform/icons/src/actions/clean.png and b/platform/icons/src/actions/clean.png differ diff --git a/platform/icons/src/actions/clean@2x.png b/platform/icons/src/actions/clean@2x.png new file mode 100644 index 000000000000..d3b52dc557ff Binary files /dev/null and b/platform/icons/src/actions/clean@2x.png differ diff --git a/platform/icons/src/actions/clean@2x_dark.png b/platform/icons/src/actions/clean@2x_dark.png new file mode 100644 index 000000000000..db8502021308 Binary files /dev/null and b/platform/icons/src/actions/clean@2x_dark.png differ diff --git a/platform/icons/src/actions/cleanLight.png b/platform/icons/src/actions/cleanLight.png index 12aebe2664db..1156231face5 100644 Binary files a/platform/icons/src/actions/cleanLight.png and b/platform/icons/src/actions/cleanLight.png differ diff --git a/platform/icons/src/actions/cleanLight@2x.png b/platform/icons/src/actions/cleanLight@2x.png new file mode 100644 index 000000000000..c80e370f8691 Binary files /dev/null and b/platform/icons/src/actions/cleanLight@2x.png differ diff --git a/platform/icons/src/actions/cleanLight@2x_dark.png b/platform/icons/src/actions/cleanLight@2x_dark.png new file mode 100644 index 000000000000..7c35c46291c7 Binary files /dev/null and b/platform/icons/src/actions/cleanLight@2x_dark.png differ diff --git a/platform/icons/src/actions/cleanLight_dark.png b/platform/icons/src/actions/cleanLight_dark.png new file mode 100644 index 000000000000..95856c30ad5b Binary files /dev/null and b/platform/icons/src/actions/cleanLight_dark.png differ diff --git a/platform/icons/src/actions/clean_dark.png b/platform/icons/src/actions/clean_dark.png new file mode 100644 index 000000000000..c07babe21e55 Binary files /dev/null and b/platform/icons/src/actions/clean_dark.png differ diff --git a/platform/icons/src/actions/closeNew.png b/platform/icons/src/actions/closeNew.png index 103ddd729751..a186f3bbbe76 100644 Binary files a/platform/icons/src/actions/closeNew.png and b/platform/icons/src/actions/closeNew.png differ diff --git a/platform/icons/src/actions/closeNew@2x.png b/platform/icons/src/actions/closeNew@2x.png index 6c948b1792d9..95d6e3ebccb2 100644 Binary files a/platform/icons/src/actions/closeNew@2x.png and b/platform/icons/src/actions/closeNew@2x.png differ diff --git a/platform/icons/src/actions/closeNew@2x_dark.png b/platform/icons/src/actions/closeNew@2x_dark.png index 6c9ebdc6949f..002bc7a70b11 100644 Binary files a/platform/icons/src/actions/closeNew@2x_dark.png and b/platform/icons/src/actions/closeNew@2x_dark.png differ diff --git a/platform/icons/src/actions/closeNewHovered.png b/platform/icons/src/actions/closeNewHovered.png index 8e7e7b7db647..eeb6054792f3 100644 Binary files a/platform/icons/src/actions/closeNewHovered.png and b/platform/icons/src/actions/closeNewHovered.png differ diff --git a/platform/icons/src/actions/closeNewHovered@2x.png b/platform/icons/src/actions/closeNewHovered@2x.png index c34ae1d83ff0..c68f2534d4eb 100644 Binary files a/platform/icons/src/actions/closeNewHovered@2x.png and b/platform/icons/src/actions/closeNewHovered@2x.png differ diff --git a/platform/icons/src/actions/closeNewHovered@2x_dark.png b/platform/icons/src/actions/closeNewHovered@2x_dark.png index d4b5f141e683..93bdc693f49e 100644 Binary files a/platform/icons/src/actions/closeNewHovered@2x_dark.png and b/platform/icons/src/actions/closeNewHovered@2x_dark.png differ diff --git a/platform/icons/src/actions/closeNewHovered_dark.png b/platform/icons/src/actions/closeNewHovered_dark.png index 958210eaa8a8..2d27e7649510 100644 Binary files a/platform/icons/src/actions/closeNewHovered_dark.png and b/platform/icons/src/actions/closeNewHovered_dark.png differ diff --git a/platform/icons/src/actions/closeNew_dark.png b/platform/icons/src/actions/closeNew_dark.png index a3002d853218..beb7d103cddb 100644 Binary files a/platform/icons/src/actions/closeNew_dark.png and b/platform/icons/src/actions/closeNew_dark.png differ diff --git a/platform/icons/src/actions/commit.png b/platform/icons/src/actions/commit.png index a443b4c7d1f1..db9995516937 100644 Binary files a/platform/icons/src/actions/commit.png and b/platform/icons/src/actions/commit.png differ diff --git a/platform/icons/src/actions/commit@2x.png b/platform/icons/src/actions/commit@2x.png new file mode 100644 index 000000000000..dfc7ae3028ab Binary files /dev/null and b/platform/icons/src/actions/commit@2x.png differ diff --git a/platform/icons/src/actions/compile_dark.png b/platform/icons/src/actions/compile_dark.png index 608d1a4b64f4..b85b82b7db65 100644 Binary files a/platform/icons/src/actions/compile_dark.png and b/platform/icons/src/actions/compile_dark.png differ diff --git a/platform/icons/src/actions/createPatch@2x.png b/platform/icons/src/actions/createPatch@2x.png new file mode 100644 index 000000000000..fa9f97a64c55 Binary files /dev/null and b/platform/icons/src/actions/createPatch@2x.png differ diff --git a/platform/icons/src/actions/cross.png b/platform/icons/src/actions/cross.png index 3decbc1ab8ae..5994bd641f16 100644 Binary files a/platform/icons/src/actions/cross.png and b/platform/icons/src/actions/cross.png differ diff --git a/platform/icons/src/actions/cross@2x.png b/platform/icons/src/actions/cross@2x.png new file mode 100644 index 000000000000..5a08ab5d0458 Binary files /dev/null and b/platform/icons/src/actions/cross@2x.png differ diff --git a/platform/icons/src/actions/cross@2x_dark.png b/platform/icons/src/actions/cross@2x_dark.png new file mode 100644 index 000000000000..88d017027d6e Binary files /dev/null and b/platform/icons/src/actions/cross@2x_dark.png differ diff --git a/platform/icons/src/actions/cross_dark.png b/platform/icons/src/actions/cross_dark.png new file mode 100644 index 000000000000..b8a8552c75f2 Binary files /dev/null and b/platform/icons/src/actions/cross_dark.png differ diff --git a/platform/icons/src/actions/delete.png b/platform/icons/src/actions/delete.png index 721c469e6172..0df8623d59db 100644 Binary files a/platform/icons/src/actions/delete.png and b/platform/icons/src/actions/delete.png differ diff --git a/platform/icons/src/actions/diff@2x.png b/platform/icons/src/actions/diff@2x.png new file mode 100644 index 000000000000..b857a544fd1c Binary files /dev/null and b/platform/icons/src/actions/diff@2x.png differ diff --git a/platform/icons/src/actions/diff@2x_dark.png b/platform/icons/src/actions/diff@2x_dark.png new file mode 100644 index 000000000000..01116d0270e7 Binary files /dev/null and b/platform/icons/src/actions/diff@2x_dark.png differ diff --git a/platform/icons/src/actions/diffWithCurrent.png b/platform/icons/src/actions/diffWithCurrent.png index b54c27535290..7ef53f380153 100644 Binary files a/platform/icons/src/actions/diffWithCurrent.png and b/platform/icons/src/actions/diffWithCurrent.png differ diff --git a/platform/icons/src/actions/diffWithCurrent@2x.png b/platform/icons/src/actions/diffWithCurrent@2x.png new file mode 100644 index 000000000000..ee3fdd870c70 Binary files /dev/null and b/platform/icons/src/actions/diffWithCurrent@2x.png differ diff --git a/platform/icons/src/actions/diffWithCurrent@2x_dark.png b/platform/icons/src/actions/diffWithCurrent@2x_dark.png new file mode 100644 index 000000000000..8f9def61cd8d Binary files /dev/null and b/platform/icons/src/actions/diffWithCurrent@2x_dark.png differ diff --git a/platform/icons/src/actions/diffWithCurrent_dark.png b/platform/icons/src/actions/diffWithCurrent_dark.png new file mode 100644 index 000000000000..7161f6772bd3 Binary files /dev/null and b/platform/icons/src/actions/diffWithCurrent_dark.png differ diff --git a/platform/icons/src/actions/diff_dark.png b/platform/icons/src/actions/diff_dark.png index 9c567df4abcf..6001686c4f05 100644 Binary files a/platform/icons/src/actions/diff_dark.png and b/platform/icons/src/actions/diff_dark.png differ diff --git a/platform/icons/src/actions/download@2x.png b/platform/icons/src/actions/download@2x.png index a596b7bd4a91..7479272ffc3d 100644 Binary files a/platform/icons/src/actions/download@2x.png and b/platform/icons/src/actions/download@2x.png differ diff --git a/platform/icons/src/actions/dump@2x.png b/platform/icons/src/actions/dump@2x.png new file mode 100644 index 000000000000..a36b002a35f7 Binary files /dev/null and b/platform/icons/src/actions/dump@2x.png differ diff --git a/platform/icons/src/actions/dump@2x_dark.png b/platform/icons/src/actions/dump@2x_dark.png new file mode 100644 index 000000000000..0578a1cdcdb6 Binary files /dev/null and b/platform/icons/src/actions/dump@2x_dark.png differ diff --git a/platform/icons/src/actions/dump_dark.png b/platform/icons/src/actions/dump_dark.png new file mode 100644 index 000000000000..b5b227a403dd Binary files /dev/null and b/platform/icons/src/actions/dump_dark.png differ diff --git a/platform/icons/src/actions/edit.png b/platform/icons/src/actions/edit.png index 80aa201a842f..5629d907fb22 100644 Binary files a/platform/icons/src/actions/edit.png and b/platform/icons/src/actions/edit.png differ diff --git a/platform/icons/src/actions/edit@2x.png b/platform/icons/src/actions/edit@2x.png new file mode 100644 index 000000000000..8645fcf52f3c Binary files /dev/null and b/platform/icons/src/actions/edit@2x.png differ diff --git a/platform/icons/src/actions/edit@2x_dark.png b/platform/icons/src/actions/edit@2x_dark.png new file mode 100644 index 000000000000..b8064c050196 Binary files /dev/null and b/platform/icons/src/actions/edit@2x_dark.png differ diff --git a/platform/icons/src/actions/editSource.png b/platform/icons/src/actions/editSource.png index a60301bb2691..a4195edbc02f 100644 Binary files a/platform/icons/src/actions/editSource.png and b/platform/icons/src/actions/editSource.png differ diff --git a/platform/icons/src/actions/editSource@2x.png b/platform/icons/src/actions/editSource@2x.png new file mode 100644 index 000000000000..90518a513a32 Binary files /dev/null and b/platform/icons/src/actions/editSource@2x.png differ diff --git a/platform/icons/src/actions/editSource@2x_dark.png b/platform/icons/src/actions/editSource@2x_dark.png new file mode 100644 index 000000000000..6e419025484e Binary files /dev/null and b/platform/icons/src/actions/editSource@2x_dark.png differ diff --git a/platform/icons/src/actions/editSource_dark.png b/platform/icons/src/actions/editSource_dark.png new file mode 100644 index 000000000000..1a172779a359 Binary files /dev/null and b/platform/icons/src/actions/editSource_dark.png differ diff --git a/platform/icons/src/actions/edit_dark.png b/platform/icons/src/actions/edit_dark.png new file mode 100644 index 000000000000..e9e47f55d787 Binary files /dev/null and b/platform/icons/src/actions/edit_dark.png differ diff --git a/platform/icons/src/actions/erDiagram.png b/platform/icons/src/actions/erDiagram.png index 91f3071d74fc..b640d77ada6d 100644 Binary files a/platform/icons/src/actions/erDiagram.png and b/platform/icons/src/actions/erDiagram.png differ diff --git a/platform/icons/src/actions/erDiagram@2x.png b/platform/icons/src/actions/erDiagram@2x.png new file mode 100644 index 000000000000..56192b72c1bc Binary files /dev/null and b/platform/icons/src/actions/erDiagram@2x.png differ diff --git a/platform/icons/src/actions/erDiagram@2x_dark.png b/platform/icons/src/actions/erDiagram@2x_dark.png new file mode 100644 index 000000000000..6408feae1498 Binary files /dev/null and b/platform/icons/src/actions/erDiagram@2x_dark.png differ diff --git a/platform/icons/src/actions/erDiagram_dark.png b/platform/icons/src/actions/erDiagram_dark.png new file mode 100644 index 000000000000..7f54b5620c48 Binary files /dev/null and b/platform/icons/src/actions/erDiagram_dark.png differ diff --git a/platform/icons/src/actions/exclude@2x.png b/platform/icons/src/actions/exclude@2x.png new file mode 100644 index 000000000000..a3666409424b Binary files /dev/null and b/platform/icons/src/actions/exclude@2x.png differ diff --git a/platform/icons/src/actions/execute.png b/platform/icons/src/actions/execute.png index 7d84dc9008e5..c1743248d995 100644 Binary files a/platform/icons/src/actions/execute.png and b/platform/icons/src/actions/execute.png differ diff --git a/platform/icons/src/actions/exit@2x.png b/platform/icons/src/actions/exit@2x.png new file mode 100644 index 000000000000..9cd385b89745 Binary files /dev/null and b/platform/icons/src/actions/exit@2x.png differ diff --git a/platform/icons/src/actions/exit@2x_dark.png b/platform/icons/src/actions/exit@2x_dark.png new file mode 100644 index 000000000000..2085e3ea7f67 Binary files /dev/null and b/platform/icons/src/actions/exit@2x_dark.png differ diff --git a/platform/icons/src/actions/exit_dark.png b/platform/icons/src/actions/exit_dark.png new file mode 100644 index 000000000000..f09dbd301990 Binary files /dev/null and b/platform/icons/src/actions/exit_dark.png differ diff --git a/platform/icons/src/actions/export@2x.png b/platform/icons/src/actions/export@2x.png new file mode 100644 index 000000000000..4f8466972dc8 Binary files /dev/null and b/platform/icons/src/actions/export@2x.png differ diff --git a/platform/icons/src/actions/filter_small@2x.png b/platform/icons/src/actions/filter_small@2x.png new file mode 100644 index 000000000000..601bd31bfb7c Binary files /dev/null and b/platform/icons/src/actions/filter_small@2x.png differ diff --git a/platform/icons/src/actions/filter_small@2x_dark.png b/platform/icons/src/actions/filter_small@2x_dark.png new file mode 100644 index 000000000000..d4ce883a34d6 Binary files /dev/null and b/platform/icons/src/actions/filter_small@2x_dark.png differ diff --git a/platform/icons/src/actions/filter_small_dark.png b/platform/icons/src/actions/filter_small_dark.png new file mode 100644 index 000000000000..9ed3055edf73 Binary files /dev/null and b/platform/icons/src/actions/filter_small_dark.png differ diff --git a/platform/icons/src/actions/gc@2x.png b/platform/icons/src/actions/gc@2x.png new file mode 100644 index 000000000000..d97b4c56d807 Binary files /dev/null and b/platform/icons/src/actions/gc@2x.png differ diff --git a/platform/icons/src/actions/gc@2x_dark.png b/platform/icons/src/actions/gc@2x_dark.png new file mode 100644 index 000000000000..05abbff4ecb7 Binary files /dev/null and b/platform/icons/src/actions/gc@2x_dark.png differ diff --git a/platform/icons/src/actions/gc_dark.png b/platform/icons/src/actions/gc_dark.png new file mode 100644 index 000000000000..498070c9101e Binary files /dev/null and b/platform/icons/src/actions/gc_dark.png differ diff --git a/platform/icons/src/actions/get.png b/platform/icons/src/actions/get.png index ec17599525f9..8ae802cc296c 100644 Binary files a/platform/icons/src/actions/get.png and b/platform/icons/src/actions/get.png differ diff --git a/platform/icons/src/actions/get@2x.png b/platform/icons/src/actions/get@2x.png new file mode 100644 index 000000000000..b5e0f3972624 Binary files /dev/null and b/platform/icons/src/actions/get@2x.png differ diff --git a/platform/icons/src/actions/groupByMethod@2x.png b/platform/icons/src/actions/groupByMethod@2x.png new file mode 100644 index 000000000000..9bc4124e4076 Binary files /dev/null and b/platform/icons/src/actions/groupByMethod@2x.png differ diff --git a/platform/icons/src/actions/groupByMethod@2x_dark.png b/platform/icons/src/actions/groupByMethod@2x_dark.png new file mode 100644 index 000000000000..5349fed766c0 Binary files /dev/null and b/platform/icons/src/actions/groupByMethod@2x_dark.png differ diff --git a/platform/icons/src/actions/groupByMethod_dark.png b/platform/icons/src/actions/groupByMethod_dark.png index 7893253dc397..6cca6e8c21b5 100644 Binary files a/platform/icons/src/actions/groupByMethod_dark.png and b/platform/icons/src/actions/groupByMethod_dark.png differ diff --git a/platform/icons/src/actions/groupByTestProduction.png b/platform/icons/src/actions/groupByTestProduction.png index 3a16c53de2f4..8cb94075d3c2 100644 Binary files a/platform/icons/src/actions/groupByTestProduction.png and b/platform/icons/src/actions/groupByTestProduction.png differ diff --git a/platform/icons/src/actions/groupByTestProduction@2x.png b/platform/icons/src/actions/groupByTestProduction@2x.png new file mode 100644 index 000000000000..e9a7e88f8129 Binary files /dev/null and b/platform/icons/src/actions/groupByTestProduction@2x.png differ diff --git a/platform/icons/src/actions/groupByTestProduction@2x_dark.png b/platform/icons/src/actions/groupByTestProduction@2x_dark.png new file mode 100644 index 000000000000..552bcec2fb94 Binary files /dev/null and b/platform/icons/src/actions/groupByTestProduction@2x_dark.png differ diff --git a/platform/icons/src/actions/groupByTestProduction_dark.png b/platform/icons/src/actions/groupByTestProduction_dark.png index cf36dba2beb0..0aa0725a1c3b 100644 Binary files a/platform/icons/src/actions/groupByTestProduction_dark.png and b/platform/icons/src/actions/groupByTestProduction_dark.png differ diff --git a/platform/icons/src/actions/install@2x.png b/platform/icons/src/actions/install@2x.png new file mode 100644 index 000000000000..7479272ffc3d Binary files /dev/null and b/platform/icons/src/actions/install@2x.png differ diff --git a/platform/icons/src/actions/menu-cut.png b/platform/icons/src/actions/menu-cut.png index f898c79d8c48..721b2f7da986 100644 Binary files a/platform/icons/src/actions/menu-cut.png and b/platform/icons/src/actions/menu-cut.png differ diff --git a/platform/icons/src/actions/menu-cut_dak.png b/platform/icons/src/actions/menu-cut_dak.png new file mode 100644 index 000000000000..68b5b22329e7 Binary files /dev/null and b/platform/icons/src/actions/menu-cut_dak.png differ diff --git a/platform/icons/src/actions/menu-find@2x.png b/platform/icons/src/actions/menu-find@2x.png new file mode 100644 index 000000000000..de19d8fdb4a2 Binary files /dev/null and b/platform/icons/src/actions/menu-find@2x.png differ diff --git a/platform/icons/src/actions/menu-open.png b/platform/icons/src/actions/menu-open.png index 44df1495985d..996b47dba167 100644 Binary files a/platform/icons/src/actions/menu-open.png and b/platform/icons/src/actions/menu-open.png differ diff --git a/platform/icons/src/actions/minimize.png b/platform/icons/src/actions/minimize.png index 061063d46c0d..77f2ef32253d 100644 Binary files a/platform/icons/src/actions/minimize.png and b/platform/icons/src/actions/minimize.png differ diff --git a/platform/icons/src/actions/minimize@2x.png b/platform/icons/src/actions/minimize@2x.png new file mode 100644 index 000000000000..0295873eb40c Binary files /dev/null and b/platform/icons/src/actions/minimize@2x.png differ diff --git a/platform/icons/src/actions/minimize@2x_dark.png b/platform/icons/src/actions/minimize@2x_dark.png new file mode 100644 index 000000000000..eac81bc4742b Binary files /dev/null and b/platform/icons/src/actions/minimize@2x_dark.png differ diff --git a/platform/icons/src/actions/minimize_dark.png b/platform/icons/src/actions/minimize_dark.png index 04edccac431f..8c47f0c5cab0 100644 Binary files a/platform/icons/src/actions/minimize_dark.png and b/platform/icons/src/actions/minimize_dark.png differ diff --git a/platform/icons/src/actions/module@2x.png b/platform/icons/src/actions/module@2x.png new file mode 100644 index 000000000000..8efd632f58e0 Binary files /dev/null and b/platform/icons/src/actions/module@2x.png differ diff --git a/platform/icons/src/actions/move-to-button-top.png b/platform/icons/src/actions/move-to-button-top.png index 2603de15e54d..8741ec956da3 100644 Binary files a/platform/icons/src/actions/move-to-button-top.png and b/platform/icons/src/actions/move-to-button-top.png differ diff --git a/platform/icons/src/actions/move-to-button-top@2x.png b/platform/icons/src/actions/move-to-button-top@2x.png new file mode 100644 index 000000000000..7f380562c77f Binary files /dev/null and b/platform/icons/src/actions/move-to-button-top@2x.png differ diff --git a/platform/icons/src/actions/move-to-button-top@2x_dark.png b/platform/icons/src/actions/move-to-button-top@2x_dark.png new file mode 100644 index 000000000000..07f2bb6534e6 Binary files /dev/null and b/platform/icons/src/actions/move-to-button-top@2x_dark.png differ diff --git a/platform/icons/src/actions/move-to-button-top_dark.png b/platform/icons/src/actions/move-to-button-top_dark.png index 640a806015bb..691ac1feb1ab 100644 Binary files a/platform/icons/src/actions/move-to-button-top_dark.png and b/platform/icons/src/actions/move-to-button-top_dark.png differ diff --git a/platform/icons/src/actions/move-to-button.png b/platform/icons/src/actions/move-to-button.png index 20cab7b151ae..57a187e206e7 100644 Binary files a/platform/icons/src/actions/move-to-button.png and b/platform/icons/src/actions/move-to-button.png differ diff --git a/platform/icons/src/actions/move-to-button@2x.png b/platform/icons/src/actions/move-to-button@2x.png new file mode 100644 index 000000000000..80fa680d5571 Binary files /dev/null and b/platform/icons/src/actions/move-to-button@2x.png differ diff --git a/platform/icons/src/actions/move-to-button@2x_dark.png b/platform/icons/src/actions/move-to-button@2x_dark.png new file mode 100644 index 000000000000..3b00c13dfd0d Binary files /dev/null and b/platform/icons/src/actions/move-to-button@2x_dark.png differ diff --git a/platform/icons/src/actions/moveDown.png b/platform/icons/src/actions/moveDown.png index e539601c03ea..0b398dd7e8fa 100644 Binary files a/platform/icons/src/actions/moveDown.png and b/platform/icons/src/actions/moveDown.png differ diff --git a/platform/icons/src/actions/moveUp.png b/platform/icons/src/actions/moveUp.png index ce4ec6b38cce..3079aa6361eb 100644 Binary files a/platform/icons/src/actions/moveUp.png and b/platform/icons/src/actions/moveUp.png differ diff --git a/platform/icons/src/actions/new@2x.png b/platform/icons/src/actions/new@2x.png new file mode 100644 index 000000000000..62a01ac8bd1d Binary files /dev/null and b/platform/icons/src/actions/new@2x.png differ diff --git a/platform/icons/src/actions/new@2x_dark.png b/platform/icons/src/actions/new@2x_dark.png new file mode 100644 index 000000000000..42144054b40c Binary files /dev/null and b/platform/icons/src/actions/new@2x_dark.png differ diff --git a/platform/icons/src/actions/newFolder.png b/platform/icons/src/actions/newFolder.png index ad15b0b616b6..d2ad99cf68dc 100644 Binary files a/platform/icons/src/actions/newFolder.png and b/platform/icons/src/actions/newFolder.png differ diff --git a/platform/icons/src/actions/newFolder@2x.png b/platform/icons/src/actions/newFolder@2x.png new file mode 100644 index 000000000000..8cc233aedcdd Binary files /dev/null and b/platform/icons/src/actions/newFolder@2x.png differ diff --git a/platform/icons/src/actions/newFolder@2x_dark.png b/platform/icons/src/actions/newFolder@2x_dark.png new file mode 100644 index 000000000000..b637f364ceb6 Binary files /dev/null and b/platform/icons/src/actions/newFolder@2x_dark.png differ diff --git a/platform/icons/src/actions/newFolder_dark.png b/platform/icons/src/actions/newFolder_dark.png new file mode 100644 index 000000000000..b44b13708cfa Binary files /dev/null and b/platform/icons/src/actions/newFolder_dark.png differ diff --git a/platform/icons/src/actions/new_dark.png b/platform/icons/src/actions/new_dark.png new file mode 100644 index 000000000000..1d9b4ca7ec47 Binary files /dev/null and b/platform/icons/src/actions/new_dark.png differ diff --git a/platform/icons/src/actions/nextfile@2x.png b/platform/icons/src/actions/nextfile@2x.png new file mode 100644 index 000000000000..d413e4516e5f Binary files /dev/null and b/platform/icons/src/actions/nextfile@2x.png differ diff --git a/platform/icons/src/actions/pause@2x.png b/platform/icons/src/actions/pause@2x.png new file mode 100644 index 000000000000..0b4c2cfcc289 Binary files /dev/null and b/platform/icons/src/actions/pause@2x.png differ diff --git a/platform/icons/src/actions/popFrame.png b/platform/icons/src/actions/popFrame.png index 89f2fbedf291..69d8f9e2bfe9 100644 Binary files a/platform/icons/src/actions/popFrame.png and b/platform/icons/src/actions/popFrame.png differ diff --git a/platform/icons/src/actions/popFrame@2x.png b/platform/icons/src/actions/popFrame@2x.png new file mode 100644 index 000000000000..aa9ce1f8076b Binary files /dev/null and b/platform/icons/src/actions/popFrame@2x.png differ diff --git a/platform/icons/src/actions/popFrame@2x_dark.png b/platform/icons/src/actions/popFrame@2x_dark.png new file mode 100644 index 000000000000..a721b06f8919 Binary files /dev/null and b/platform/icons/src/actions/popFrame@2x_dark.png differ diff --git a/platform/icons/src/actions/popFrame_dark.png b/platform/icons/src/actions/popFrame_dark.png new file mode 100644 index 000000000000..77410202ad9d Binary files /dev/null and b/platform/icons/src/actions/popFrame_dark.png differ diff --git a/platform/icons/src/actions/prevfile.png b/platform/icons/src/actions/prevfile.png index b308230e739c..d5de66649c79 100644 Binary files a/platform/icons/src/actions/prevfile.png and b/platform/icons/src/actions/prevfile.png differ diff --git a/platform/icons/src/actions/prevfile@2x.png b/platform/icons/src/actions/prevfile@2x.png new file mode 100644 index 000000000000..662e95f7d611 Binary files /dev/null and b/platform/icons/src/actions/prevfile@2x.png differ diff --git a/platform/icons/src/actions/preview.png b/platform/icons/src/actions/preview.png index 9c0b3c26a9de..c84386e35792 100644 Binary files a/platform/icons/src/actions/preview.png and b/platform/icons/src/actions/preview.png differ diff --git a/platform/icons/src/actions/previewDetails.png b/platform/icons/src/actions/previewDetails.png index b8bc7b7dc389..5fef9cbea043 100644 Binary files a/platform/icons/src/actions/previewDetails.png and b/platform/icons/src/actions/previewDetails.png differ diff --git a/platform/icons/src/actions/previewDetails@2x.png b/platform/icons/src/actions/previewDetails@2x.png new file mode 100644 index 000000000000..92563e595b93 Binary files /dev/null and b/platform/icons/src/actions/previewDetails@2x.png differ diff --git a/platform/icons/src/actions/previousOccurence.png b/platform/icons/src/actions/previousOccurence.png index 3079aa6361eb..ce4ec6b38cce 100644 Binary files a/platform/icons/src/actions/previousOccurence.png and b/platform/icons/src/actions/previousOccurence.png differ diff --git a/platform/icons/src/actions/properties.png b/platform/icons/src/actions/properties.png index ce6649fa96ca..188c459844ba 100644 Binary files a/platform/icons/src/actions/properties.png and b/platform/icons/src/actions/properties.png differ diff --git a/platform/icons/src/actions/properties@2x.png b/platform/icons/src/actions/properties@2x.png new file mode 100644 index 000000000000..0509f46bfea0 Binary files /dev/null and b/platform/icons/src/actions/properties@2x.png differ diff --git a/platform/icons/src/actions/properties@2x_dark.png b/platform/icons/src/actions/properties@2x_dark.png new file mode 100644 index 000000000000..04faa51b7f28 Binary files /dev/null and b/platform/icons/src/actions/properties@2x_dark.png differ diff --git a/platform/icons/src/actions/quickList.png b/platform/icons/src/actions/quickList.png index 8461026df4f4..fc57efdf7871 100644 Binary files a/platform/icons/src/actions/quickList.png and b/platform/icons/src/actions/quickList.png differ diff --git a/platform/icons/src/actions/quickList@2x.png b/platform/icons/src/actions/quickList@2x.png new file mode 100644 index 000000000000..7c1c707930b4 Binary files /dev/null and b/platform/icons/src/actions/quickList@2x.png differ diff --git a/platform/icons/src/actions/realIntentionBulb.png b/platform/icons/src/actions/realIntentionBulb.png index ed595ee60556..3a60ce958e0c 100644 Binary files a/platform/icons/src/actions/realIntentionBulb.png and b/platform/icons/src/actions/realIntentionBulb.png differ diff --git a/platform/icons/src/actions/realIntentionBulb@2x.png b/platform/icons/src/actions/realIntentionBulb@2x.png new file mode 100644 index 000000000000..757cf33dd26b Binary files /dev/null and b/platform/icons/src/actions/realIntentionBulb@2x.png differ diff --git a/platform/icons/src/actions/realIntentionBulb@2x_dark.png b/platform/icons/src/actions/realIntentionBulb@2x_dark.png new file mode 100644 index 000000000000..360b72a7aa84 Binary files /dev/null and b/platform/icons/src/actions/realIntentionBulb@2x_dark.png differ diff --git a/platform/icons/src/actions/realIntentionBulb_dark.png b/platform/icons/src/actions/realIntentionBulb_dark.png new file mode 100644 index 000000000000..9dd005c9f37f Binary files /dev/null and b/platform/icons/src/actions/realIntentionBulb_dark.png differ diff --git a/platform/icons/src/actions/realIntentionOffBulb.png b/platform/icons/src/actions/realIntentionOffBulb.png index dfaf4b0c45e9..caf6eb131b0e 100644 Binary files a/platform/icons/src/actions/realIntentionOffBulb.png and b/platform/icons/src/actions/realIntentionOffBulb.png differ diff --git a/platform/icons/src/actions/realIntentionOffBulb@2x.png b/platform/icons/src/actions/realIntentionOffBulb@2x.png new file mode 100644 index 000000000000..30e5510c8b81 Binary files /dev/null and b/platform/icons/src/actions/realIntentionOffBulb@2x.png differ diff --git a/platform/icons/src/actions/realIntentionOffBulb@2x_dark.png b/platform/icons/src/actions/realIntentionOffBulb@2x_dark.png new file mode 100644 index 000000000000..2578b34e22ea Binary files /dev/null and b/platform/icons/src/actions/realIntentionOffBulb@2x_dark.png differ diff --git a/platform/icons/src/actions/realIntentionOffBulb_dark.png b/platform/icons/src/actions/realIntentionOffBulb_dark.png new file mode 100644 index 000000000000..8ed0a4f3f0ce Binary files /dev/null and b/platform/icons/src/actions/realIntentionOffBulb_dark.png differ diff --git a/platform/icons/src/actions/redo.png b/platform/icons/src/actions/redo.png index e84500da958d..0de2b708182f 100644 Binary files a/platform/icons/src/actions/redo.png and b/platform/icons/src/actions/redo.png differ diff --git a/platform/icons/src/actions/refactoringBulb.png b/platform/icons/src/actions/refactoringBulb.png index de41c4efbb6c..342a95abee7b 100644 Binary files a/platform/icons/src/actions/refactoringBulb.png and b/platform/icons/src/actions/refactoringBulb.png differ diff --git a/platform/icons/src/actions/refactoringBulb@2x.png b/platform/icons/src/actions/refactoringBulb@2x.png index 4bddae58ce3a..4782bd971805 100644 Binary files a/platform/icons/src/actions/refactoringBulb@2x.png and b/platform/icons/src/actions/refactoringBulb@2x.png differ diff --git a/platform/icons/src/actions/refactoringBulb@2x_dark.png b/platform/icons/src/actions/refactoringBulb@2x_dark.png new file mode 100644 index 000000000000..2f4dcb29e6e7 Binary files /dev/null and b/platform/icons/src/actions/refactoringBulb@2x_dark.png differ diff --git a/platform/icons/src/actions/refactoringBulb_dark.png b/platform/icons/src/actions/refactoringBulb_dark.png new file mode 100644 index 000000000000..2dc5c102adc7 Binary files /dev/null and b/platform/icons/src/actions/refactoringBulb_dark.png differ diff --git a/platform/icons/src/actions/rerun@2x.png b/platform/icons/src/actions/rerun@2x.png new file mode 100644 index 000000000000..ffff76be27eb Binary files /dev/null and b/platform/icons/src/actions/rerun@2x.png differ diff --git a/platform/icons/src/actions/reset@2x.png b/platform/icons/src/actions/reset@2x.png new file mode 100644 index 000000000000..d868d336033c Binary files /dev/null and b/platform/icons/src/actions/reset@2x.png differ diff --git a/platform/icons/src/actions/restart.png b/platform/icons/src/actions/restart.png index c910a5b960de..d44c69876968 100644 Binary files a/platform/icons/src/actions/restart.png and b/platform/icons/src/actions/restart.png differ diff --git a/platform/icons/src/actions/restart@2x.png b/platform/icons/src/actions/restart@2x.png new file mode 100644 index 000000000000..becc35a59aa3 Binary files /dev/null and b/platform/icons/src/actions/restart@2x.png differ diff --git a/platform/icons/src/actions/resume.png b/platform/icons/src/actions/resume.png index 049bb8c759fc..2c9edba5982b 100644 Binary files a/platform/icons/src/actions/resume.png and b/platform/icons/src/actions/resume.png differ diff --git a/platform/icons/src/actions/resume@2x.png b/platform/icons/src/actions/resume@2x.png new file mode 100644 index 000000000000..cfc5049b6898 Binary files /dev/null and b/platform/icons/src/actions/resume@2x.png differ diff --git a/platform/icons/src/actions/rollback.png b/platform/icons/src/actions/rollback.png index 8a973774e18f..501bcd0c8538 100644 Binary files a/platform/icons/src/actions/rollback.png and b/platform/icons/src/actions/rollback.png differ diff --git a/platform/icons/src/actions/runToCursor.png b/platform/icons/src/actions/runToCursor.png index 9ad1357c1b00..213a13d5ceae 100644 Binary files a/platform/icons/src/actions/runToCursor.png and b/platform/icons/src/actions/runToCursor.png differ diff --git a/platform/icons/src/actions/runToCursor@2x.png b/platform/icons/src/actions/runToCursor@2x.png new file mode 100644 index 000000000000..789364cd626d Binary files /dev/null and b/platform/icons/src/actions/runToCursor@2x.png differ diff --git a/platform/icons/src/actions/runToCursor@2x_dark.png b/platform/icons/src/actions/runToCursor@2x_dark.png new file mode 100644 index 000000000000..96423c5702fb Binary files /dev/null and b/platform/icons/src/actions/runToCursor@2x_dark.png differ diff --git a/platform/icons/src/actions/runToCursor_dark.png b/platform/icons/src/actions/runToCursor_dark.png new file mode 100644 index 000000000000..73a56278da00 Binary files /dev/null and b/platform/icons/src/actions/runToCursor_dark.png differ diff --git a/platform/icons/src/actions/search.png b/platform/icons/src/actions/search.png index 5e8ca83555aa..5af991bf9d84 100644 Binary files a/platform/icons/src/actions/search.png and b/platform/icons/src/actions/search.png differ diff --git a/platform/icons/src/actions/search@2x.png b/platform/icons/src/actions/search@2x.png new file mode 100644 index 000000000000..d50b0bb51197 Binary files /dev/null and b/platform/icons/src/actions/search@2x.png differ diff --git a/platform/icons/src/actions/search@2x_dark.png b/platform/icons/src/actions/search@2x_dark.png new file mode 100644 index 000000000000..16492c46ed37 Binary files /dev/null and b/platform/icons/src/actions/search@2x_dark.png differ diff --git a/platform/icons/src/actions/search_dark.png b/platform/icons/src/actions/search_dark.png new file mode 100644 index 000000000000..241fbbf5bf5e Binary files /dev/null and b/platform/icons/src/actions/search_dark.png differ diff --git a/platform/icons/src/actions/selectall.png b/platform/icons/src/actions/selectall.png index 70866a881ae3..515bbd1d02be 100644 Binary files a/platform/icons/src/actions/selectall.png and b/platform/icons/src/actions/selectall.png differ diff --git a/platform/icons/src/actions/selectall@2x.png b/platform/icons/src/actions/selectall@2x.png new file mode 100644 index 000000000000..57b0ef0db7fb Binary files /dev/null and b/platform/icons/src/actions/selectall@2x.png differ diff --git a/platform/icons/src/actions/selectall@2x_dark.png b/platform/icons/src/actions/selectall@2x_dark.png new file mode 100644 index 000000000000..ffe84befec90 Binary files /dev/null and b/platform/icons/src/actions/selectall@2x_dark.png differ diff --git a/platform/icons/src/actions/selectall_dark.png b/platform/icons/src/actions/selectall_dark.png new file mode 100644 index 000000000000..74ae140b42ae Binary files /dev/null and b/platform/icons/src/actions/selectall_dark.png differ diff --git a/platform/icons/src/actions/share.png b/platform/icons/src/actions/share.png index 8472a4bfbe0f..e4348f7dcab5 100644 Binary files a/platform/icons/src/actions/share.png and b/platform/icons/src/actions/share.png differ diff --git a/platform/icons/src/actions/share@2x.png b/platform/icons/src/actions/share@2x.png new file mode 100644 index 000000000000..fc49e83b5f77 Binary files /dev/null and b/platform/icons/src/actions/share@2x.png differ diff --git a/platform/icons/src/actions/showAsTree@2x.png b/platform/icons/src/actions/showAsTree@2x.png new file mode 100644 index 000000000000..5f301ac90a55 Binary files /dev/null and b/platform/icons/src/actions/showAsTree@2x.png differ diff --git a/platform/icons/src/actions/showAsTree@2x_dark.png b/platform/icons/src/actions/showAsTree@2x_dark.png new file mode 100644 index 000000000000..43aea857d138 Binary files /dev/null and b/platform/icons/src/actions/showAsTree@2x_dark.png differ diff --git a/platform/icons/src/actions/showAsTree_dark.png b/platform/icons/src/actions/showAsTree_dark.png new file mode 100644 index 000000000000..90a124110da9 Binary files /dev/null and b/platform/icons/src/actions/showAsTree_dark.png differ diff --git a/platform/icons/src/actions/showChangesOnly.png b/platform/icons/src/actions/showChangesOnly.png index 81e6ecc7956c..8c96a902bcb3 100644 Binary files a/platform/icons/src/actions/showChangesOnly.png and b/platform/icons/src/actions/showChangesOnly.png differ diff --git a/platform/icons/src/actions/showChangesOnly@2x.png b/platform/icons/src/actions/showChangesOnly@2x.png new file mode 100644 index 000000000000..2d33c6d8f4c5 Binary files /dev/null and b/platform/icons/src/actions/showChangesOnly@2x.png differ diff --git a/platform/icons/src/actions/showChangesOnly@2x_dark.png b/platform/icons/src/actions/showChangesOnly@2x_dark.png new file mode 100644 index 000000000000..26234ff61cca Binary files /dev/null and b/platform/icons/src/actions/showChangesOnly@2x_dark.png differ diff --git a/platform/icons/src/actions/showChangesOnly_dark.png b/platform/icons/src/actions/showChangesOnly_dark.png new file mode 100644 index 000000000000..d89861a28d1d Binary files /dev/null and b/platform/icons/src/actions/showChangesOnly_dark.png differ diff --git a/platform/icons/src/actions/showHiddens@2x.png b/platform/icons/src/actions/showHiddens@2x.png new file mode 100644 index 000000000000..ee64b956c4c0 Binary files /dev/null and b/platform/icons/src/actions/showHiddens@2x.png differ diff --git a/platform/icons/src/actions/showHiddens@2x_dark.png b/platform/icons/src/actions/showHiddens@2x_dark.png new file mode 100644 index 000000000000..0db52cd5c739 Binary files /dev/null and b/platform/icons/src/actions/showHiddens@2x_dark.png differ diff --git a/platform/icons/src/actions/showHiddens_dark.png b/platform/icons/src/actions/showHiddens_dark.png new file mode 100644 index 000000000000..ae045498c7ac Binary files /dev/null and b/platform/icons/src/actions/showHiddens_dark.png differ diff --git a/platform/icons/src/actions/showImportStatements@2x.png b/platform/icons/src/actions/showImportStatements@2x.png new file mode 100644 index 000000000000..9dd97b153334 Binary files /dev/null and b/platform/icons/src/actions/showImportStatements@2x.png differ diff --git a/platform/icons/src/actions/showReadAccess@2x.png b/platform/icons/src/actions/showReadAccess@2x.png new file mode 100644 index 000000000000..1ca2c7821e51 Binary files /dev/null and b/platform/icons/src/actions/showReadAccess@2x.png differ diff --git a/platform/icons/src/actions/showReadAccess@2x_dark.png b/platform/icons/src/actions/showReadAccess@2x_dark.png new file mode 100644 index 000000000000..ad587ecd59a7 Binary files /dev/null and b/platform/icons/src/actions/showReadAccess@2x_dark.png differ diff --git a/platform/icons/src/actions/showReadAccess_dark.png b/platform/icons/src/actions/showReadAccess_dark.png new file mode 100644 index 000000000000..edb46473092c Binary files /dev/null and b/platform/icons/src/actions/showReadAccess_dark.png differ diff --git a/platform/icons/src/actions/showWriteAccess.png b/platform/icons/src/actions/showWriteAccess.png index c6bb062ceef9..ca39dd1b924a 100644 Binary files a/platform/icons/src/actions/showWriteAccess.png and b/platform/icons/src/actions/showWriteAccess.png differ diff --git a/platform/icons/src/actions/showWriteAccess@2x.png b/platform/icons/src/actions/showWriteAccess@2x.png new file mode 100644 index 000000000000..57c084ce3ccd Binary files /dev/null and b/platform/icons/src/actions/showWriteAccess@2x.png differ diff --git a/platform/icons/src/actions/showWriteAccess@2x_dark.png b/platform/icons/src/actions/showWriteAccess@2x_dark.png new file mode 100644 index 000000000000..64a7bc6ae62f Binary files /dev/null and b/platform/icons/src/actions/showWriteAccess@2x_dark.png differ diff --git a/platform/icons/src/actions/showWriteAccess_dark.png b/platform/icons/src/actions/showWriteAccess_dark.png new file mode 100644 index 000000000000..ad307bf18842 Binary files /dev/null and b/platform/icons/src/actions/showWriteAccess_dark.png differ diff --git a/platform/icons/src/actions/splitHorizontally.png b/platform/icons/src/actions/splitHorizontally.png index 050b373909a9..b696e9d46d69 100644 Binary files a/platform/icons/src/actions/splitHorizontally.png and b/platform/icons/src/actions/splitHorizontally.png differ diff --git a/platform/icons/src/actions/splitHorizontally@2x.png b/platform/icons/src/actions/splitHorizontally@2x.png new file mode 100644 index 000000000000..7060af39d5a4 Binary files /dev/null and b/platform/icons/src/actions/splitHorizontally@2x.png differ diff --git a/platform/icons/src/actions/splitVertically@2x.png b/platform/icons/src/actions/splitVertically@2x.png new file mode 100644 index 000000000000..a9d3edfff072 Binary files /dev/null and b/platform/icons/src/actions/splitVertically@2x.png differ diff --git a/platform/icons/src/actions/startDebugger_dark.png b/platform/icons/src/actions/startDebugger_dark.png index 27b35cb5fa46..1ac64e982de7 100644 Binary files a/platform/icons/src/actions/startDebugger_dark.png and b/platform/icons/src/actions/startDebugger_dark.png differ diff --git a/platform/icons/src/actions/stepOut.png b/platform/icons/src/actions/stepOut.png index f564b7251a42..0322ede64efa 100644 Binary files a/platform/icons/src/actions/stepOut.png and b/platform/icons/src/actions/stepOut.png differ diff --git a/platform/icons/src/actions/stepOut@2x.png b/platform/icons/src/actions/stepOut@2x.png new file mode 100644 index 000000000000..019572fcf14b Binary files /dev/null and b/platform/icons/src/actions/stepOut@2x.png differ diff --git a/platform/icons/src/actions/stepOut@2x_dark.png b/platform/icons/src/actions/stepOut@2x_dark.png new file mode 100644 index 000000000000..2049264a81d3 Binary files /dev/null and b/platform/icons/src/actions/stepOut@2x_dark.png differ diff --git a/platform/icons/src/actions/stepOut_dark.png b/platform/icons/src/actions/stepOut_dark.png new file mode 100644 index 000000000000..add760a2e0bf Binary files /dev/null and b/platform/icons/src/actions/stepOut_dark.png differ diff --git a/platform/icons/src/actions/submit1@2x.png b/platform/icons/src/actions/submit1@2x.png new file mode 100644 index 000000000000..7326d03edebf Binary files /dev/null and b/platform/icons/src/actions/submit1@2x.png differ diff --git a/platform/icons/src/actions/submit1@2x_dark.png b/platform/icons/src/actions/submit1@2x_dark.png new file mode 100644 index 000000000000..1ddfee82f72e Binary files /dev/null and b/platform/icons/src/actions/submit1@2x_dark.png differ diff --git a/platform/icons/src/actions/suspend@2x.png b/platform/icons/src/actions/suspend@2x.png new file mode 100644 index 000000000000..d9a1636ca5ae Binary files /dev/null and b/platform/icons/src/actions/suspend@2x.png differ diff --git a/platform/icons/src/actions/swapPanels.png b/platform/icons/src/actions/swapPanels.png index cb8b10b5172f..6484cdedfea3 100644 Binary files a/platform/icons/src/actions/swapPanels.png and b/platform/icons/src/actions/swapPanels.png differ diff --git a/platform/icons/src/actions/swapPanels@2x.png b/platform/icons/src/actions/swapPanels@2x.png new file mode 100644 index 000000000000..98362d31fc30 Binary files /dev/null and b/platform/icons/src/actions/swapPanels@2x.png differ diff --git a/platform/icons/src/actions/swapPanels@2x_dark.png b/platform/icons/src/actions/swapPanels@2x_dark.png new file mode 100644 index 000000000000..d047770e42d5 Binary files /dev/null and b/platform/icons/src/actions/swapPanels@2x_dark.png differ diff --git a/platform/icons/src/actions/swapPanels_dark.png b/platform/icons/src/actions/swapPanels_dark.png index b9ffb8ce6d0d..fc717693ab1b 100644 Binary files a/platform/icons/src/actions/swapPanels_dark.png and b/platform/icons/src/actions/swapPanels_dark.png differ diff --git a/platform/icons/src/actions/syncPanels.png b/platform/icons/src/actions/syncPanels.png index 1a639e0d9aae..958149a866f1 100644 Binary files a/platform/icons/src/actions/syncPanels.png and b/platform/icons/src/actions/syncPanels.png differ diff --git a/platform/icons/src/actions/syncPanels@2x.png b/platform/icons/src/actions/syncPanels@2x.png new file mode 100644 index 000000000000..e8ebd3002c58 Binary files /dev/null and b/platform/icons/src/actions/syncPanels@2x.png differ diff --git a/platform/icons/src/actions/syncPanels@2x_dark.png b/platform/icons/src/actions/syncPanels@2x_dark.png new file mode 100644 index 000000000000..7e4c0d45c2f4 Binary files /dev/null and b/platform/icons/src/actions/syncPanels@2x_dark.png differ diff --git a/platform/icons/src/actions/syncPanels_dark.png b/platform/icons/src/actions/syncPanels_dark.png index d0d8e0a80baf..c16a689fd1f5 100644 Binary files a/platform/icons/src/actions/syncPanels_dark.png and b/platform/icons/src/actions/syncPanels_dark.png differ diff --git a/platform/icons/src/actions/toggleSoftWrap@2x.png b/platform/icons/src/actions/toggleSoftWrap@2x.png new file mode 100644 index 000000000000..ff2f8c99c18d Binary files /dev/null and b/platform/icons/src/actions/toggleSoftWrap@2x.png differ diff --git a/platform/icons/src/actions/toggleSoftWrap@2x_dark.png b/platform/icons/src/actions/toggleSoftWrap@2x_dark.png new file mode 100644 index 000000000000..aa03b86ffbc9 Binary files /dev/null and b/platform/icons/src/actions/toggleSoftWrap@2x_dark.png differ diff --git a/platform/icons/src/actions/traceInto.png b/platform/icons/src/actions/traceInto.png index 8903aae5beb8..2b72d2982161 100644 Binary files a/platform/icons/src/actions/traceInto.png and b/platform/icons/src/actions/traceInto.png differ diff --git a/platform/icons/src/actions/traceInto@2x.png b/platform/icons/src/actions/traceInto@2x.png new file mode 100644 index 000000000000..2b2bc735e102 Binary files /dev/null and b/platform/icons/src/actions/traceInto@2x.png differ diff --git a/platform/icons/src/actions/traceInto@2x_dark.png b/platform/icons/src/actions/traceInto@2x_dark.png new file mode 100644 index 000000000000..5214ebbc9408 Binary files /dev/null and b/platform/icons/src/actions/traceInto@2x_dark.png differ diff --git a/platform/icons/src/actions/traceInto_dark.png b/platform/icons/src/actions/traceInto_dark.png new file mode 100644 index 000000000000..547b983b9173 Binary files /dev/null and b/platform/icons/src/actions/traceInto_dark.png differ diff --git a/platform/icons/src/actions/traceOver.png b/platform/icons/src/actions/traceOver.png index 4c88b9b151b2..e78bddab632b 100644 Binary files a/platform/icons/src/actions/traceOver.png and b/platform/icons/src/actions/traceOver.png differ diff --git a/platform/icons/src/actions/traceOver@2x.png b/platform/icons/src/actions/traceOver@2x.png new file mode 100644 index 000000000000..321453696547 Binary files /dev/null and b/platform/icons/src/actions/traceOver@2x.png differ diff --git a/platform/icons/src/actions/traceOver@2x_dark.png b/platform/icons/src/actions/traceOver@2x_dark.png new file mode 100644 index 000000000000..5e7268f982b3 Binary files /dev/null and b/platform/icons/src/actions/traceOver@2x_dark.png differ diff --git a/platform/icons/src/actions/traceOver_dark.png b/platform/icons/src/actions/traceOver_dark.png new file mode 100644 index 000000000000..5a6865741074 Binary files /dev/null and b/platform/icons/src/actions/traceOver_dark.png differ diff --git a/platform/icons/src/actions/uninstall.png b/platform/icons/src/actions/uninstall.png index 5f9427ea60b7..4555fe0ea957 100644 Binary files a/platform/icons/src/actions/uninstall.png and b/platform/icons/src/actions/uninstall.png differ diff --git a/platform/icons/src/actions/unselectall.png b/platform/icons/src/actions/unselectall.png index 81a1f0b59659..59b4ae1f6d59 100644 Binary files a/platform/icons/src/actions/unselectall.png and b/platform/icons/src/actions/unselectall.png differ diff --git a/platform/icons/src/actions/unselectall@2x.png b/platform/icons/src/actions/unselectall@2x.png new file mode 100644 index 000000000000..10c1d34efd62 Binary files /dev/null and b/platform/icons/src/actions/unselectall@2x.png differ diff --git a/platform/icons/src/actions/unselectall@2x_dark.png b/platform/icons/src/actions/unselectall@2x_dark.png new file mode 100644 index 000000000000..39458299b268 Binary files /dev/null and b/platform/icons/src/actions/unselectall@2x_dark.png differ diff --git a/platform/icons/src/actions/unselectall_dark.png b/platform/icons/src/actions/unselectall_dark.png new file mode 100644 index 000000000000..439efe873cdb Binary files /dev/null and b/platform/icons/src/actions/unselectall_dark.png differ diff --git a/platform/icons/src/actions/unshare.png b/platform/icons/src/actions/unshare.png index 233b404e744a..d7d977a54e16 100644 Binary files a/platform/icons/src/actions/unshare.png and b/platform/icons/src/actions/unshare.png differ diff --git a/platform/icons/src/actions/unshare@2x.png b/platform/icons/src/actions/unshare@2x.png new file mode 100644 index 000000000000..c6ad52c64907 Binary files /dev/null and b/platform/icons/src/actions/unshare@2x.png differ diff --git a/platform/icons/src/debugger/actions/force_run_to_cursor.png b/platform/icons/src/debugger/actions/force_run_to_cursor.png index 065d3b7d0e75..ac4257c28169 100644 Binary files a/platform/icons/src/debugger/actions/force_run_to_cursor.png and b/platform/icons/src/debugger/actions/force_run_to_cursor.png differ diff --git a/platform/icons/src/debugger/actions/force_run_to_cursor@2x.png b/platform/icons/src/debugger/actions/force_run_to_cursor@2x.png new file mode 100644 index 000000000000..8e23e6d60cf5 Binary files /dev/null and b/platform/icons/src/debugger/actions/force_run_to_cursor@2x.png differ diff --git a/platform/icons/src/debugger/actions/force_step_into.png b/platform/icons/src/debugger/actions/force_step_into.png index 94394f2a0a55..097c92a8b7ad 100644 Binary files a/platform/icons/src/debugger/actions/force_step_into.png and b/platform/icons/src/debugger/actions/force_step_into.png differ diff --git a/platform/icons/src/debugger/actions/force_step_into@2x.png b/platform/icons/src/debugger/actions/force_step_into@2x.png new file mode 100644 index 000000000000..f1c807186bcb Binary files /dev/null and b/platform/icons/src/debugger/actions/force_step_into@2x.png differ diff --git a/platform/icons/src/debugger/actions/force_step_over.png b/platform/icons/src/debugger/actions/force_step_over.png index fe313305fdbe..b1353864382c 100644 Binary files a/platform/icons/src/debugger/actions/force_step_over.png and b/platform/icons/src/debugger/actions/force_step_over.png differ diff --git a/platform/icons/src/debugger/actions/force_step_over@2x.png b/platform/icons/src/debugger/actions/force_step_over@2x.png new file mode 100644 index 000000000000..47f2b4382870 Binary files /dev/null and b/platform/icons/src/debugger/actions/force_step_over@2x.png differ diff --git a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java index 1aca7059ab7e..c3100e8501c5 100644 --- a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java +++ b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java @@ -20,19 +20,25 @@ package com.intellij.psi.stubs; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Processor; +import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NotNull; import java.util.Collection; +import java.util.Iterator; public abstract class StubIndex { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.StubIndex"); + private static class StubIndexHolder { private static final StubIndex ourInstance = ApplicationManager.getApplication().getComponent(StubIndex.class); } - public static StubIndex getInstance() { return StubIndexHolder.ourInstance; } @@ -50,4 +56,32 @@ public abstract class StubIndex { @NotNull public abstract Collection getAllKeys(@NotNull StubIndexKey indexKey, @NotNull Project project); + + public Collection safeGet(@NotNull StubIndexKey indexKey, + @NotNull Key key, + @NotNull final Project project, + final GlobalSearchScope scope, + @NotNull Class requiredClass) { + Collection collection = getInstance().get(indexKey, key, project, scope); + for (Iterator iterator = collection.iterator(); iterator.hasNext(); ) { + Psi psi = iterator.next(); + if (!requiredClass.isInstance(psi)) { + iterator.remove(); + + VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); + if (faultyContainer != null && faultyContainer.isValid()) { + FileBasedIndex.getInstance().requestReindex(faultyContainer); + } + + reportStubPsiMismatch(psi, faultyContainer); + } + } + + return collection; + } + + protected void reportStubPsiMismatch(Psi psi, VirtualFile file) { + LOG.error("Invalid stub element type in index: " + file + ". found: " + psi); + } + } diff --git a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java index 6d9032371052..c3c58b411cad 100644 --- a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java +++ b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -121,7 +121,7 @@ public class AnalysisScope { myModule = null; myScope = null; myElement = psiDirectory; - myType = DIRECTORY; + myType = DIRECTORY; } public AnalysisScope(@NotNull PsiFile psiFile) { @@ -555,14 +555,18 @@ public class AnalysisScope { } } - private static PsiFile getPsiFileInReadAction(@NotNull final PsiManager psiManager, @NotNull final VirtualFile file) { return ApplicationManager.getApplication().runReadAction(new Computable() { @Override @Nullable public PsiFile compute() { - final PsiFile psiFile = psiManager.findFile(file); - return psiFile != null && psiFile.isValid() ? psiFile : null; + if (file.isValid()) { + PsiFile psiFile = psiManager.findFile(file); + if (psiFile != null && psiFile.isValid()) { + return psiFile; + } + } + return null; } }); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index d6b6991f7fc6..b2a683c691bf 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -126,10 +126,8 @@ public class CodeCompletionHandlerBase { CompletionLookupArranger.applyLastCompletionStatisticsUpdate(); } - final Document document = editor.getDocument(); - if (!CodeInsightUtilBase.prepareEditorForWrite(editor)) return; - - if (!FileDocumentManager.getInstance().requestWriting(document, project)) { + if (!CodeInsightUtilBase.prepareEditorForWrite(editor) || + !FileDocumentManager.getInstance().requestWriting(editor.getDocument(), project)) { return; } @@ -164,56 +162,16 @@ public class CodeCompletionHandlerBase { Runnable initCmd = new Runnable() { @Override public void run() { - Runnable runnable = new Runnable() { @Override public void run() { - final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); - EditorUtil.fillVirtualSpaceUntilCaret(editor); - documentManager.commitAllDocuments(); - - int docLength = editor.getDocument().getTextLength(); - int psiLength = psiFile.getTextLength(); - if (docLength != psiLength) { - if (ApplicationManagerEx.getApplicationEx().isInternal()) { - String docText = editor.getDocument().getText(); - String psiText = psiFile.getText(); - String message = "unsuccessful commit: (injected=" +(editor instanceof EditorWindow) +"); document " + System.identityHashCode(editor.getDocument()) + "; " + - "docText=\n'" + docText +"' (" + docText.length() +" chars; .length()="+ docLength+")\n" + - "; fileText=\n'" + psiText + "' (" + psiText.length() +" chars; .length()="+ psiLength+")\n" - ; - throw new AssertionError(message); - } - - throw new AssertionError("unsuccessful commit: injected=" + (editor instanceof EditorWindow)); - } + PsiDocumentManager.getInstance(project).commitAllDocuments(); + assertCommitSuccessful(editor, psiFile); checkEditorValid2(editor); - final Ref current = Ref.create(null); - initializationContext[0] = new CompletionInitializationContext(editor, psiFile, myCompletionType) { - CompletionContributor dummyIdentifierChanger; - @Override - public void setFileCopyPatcher(@NotNull FileCopyPatcher fileCopyPatcher) { - super.setFileCopyPatcher(fileCopyPatcher); - - if (dummyIdentifierChanger != null) { - LOG.error("Changing the dummy identifier twice, already changed by " + dummyIdentifierChanger); - } - dummyIdentifierChanger = current.get(); - } - }; - for (final CompletionContributor contributor : CompletionContributor.forLanguage(initializationContext[0].getPositionLanguage())) { - if (DumbService.getInstance(project).isDumb() && !DumbService.isDumbAware(contributor)) { - continue; - } - - current.set(contributor); - contributor.beforeCompletion(initializationContext[0]); - checkEditorValid2(editor); - assert !documentManager.isUncommited(document) : "Contributor " + contributor + " left the document uncommitted"; - } + initializationContext[0] = runContributorsBeforeCompletion(editor, psiFile); } }; ApplicationManager.getApplication().runWriteAction(runnable); @@ -231,6 +189,51 @@ public class CodeCompletionHandlerBase { insertDummyIdentifier(initializationContext[0], hasModifiers, time); } + private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile) { + final Ref current = Ref.create(null); + CompletionInitializationContext context = new CompletionInitializationContext(editor, psiFile, myCompletionType) { + CompletionContributor dummyIdentifierChanger; + + @Override + public void setFileCopyPatcher(@NotNull FileCopyPatcher fileCopyPatcher) { + super.setFileCopyPatcher(fileCopyPatcher); + + if (dummyIdentifierChanger != null) { + LOG.error("Changing the dummy identifier twice, already changed by " + dummyIdentifierChanger); + } + dummyIdentifierChanger = current.get(); + } + }; + List contributors = CompletionContributor.forLanguage(context.getPositionLanguage()); + Project project = psiFile.getProject(); + List filteredContributors = DumbService.getInstance(project).filterByDumbAwareness(contributors); + for (final CompletionContributor contributor : filteredContributors) { + current.set(contributor); + contributor.beforeCompletion(context); + checkEditorValid2(editor); + assert !PsiDocumentManager.getInstance(project).isUncommited(editor.getDocument()) : "Contributor " + contributor + " left the document uncommitted"; + } + return context; + } + + private static void assertCommitSuccessful(Editor editor, PsiFile psiFile) { + int docLength = editor.getDocument().getTextLength(); + int psiLength = psiFile.getTextLength(); + if (docLength != psiLength) { + if (ApplicationManagerEx.getApplicationEx().isInternal()) { + String docText = editor.getDocument().getText(); + String psiText = psiFile.getText(); + String message = "unsuccessful commit: (injected=" +(editor instanceof EditorWindow) +"); document " + System.identityHashCode(editor.getDocument()) + "; " + + "docText=\n'" + docText +"' (" + docText.length() +" chars; .length()="+ docLength+")\n" + + "; fileText=\n'" + psiText + "' (" + psiText.length() +" chars; .length()="+ psiLength+")\n" + ; + throw new AssertionError(message); + } + + throw new AssertionError("unsuccessful commit: injected=" + (editor instanceof EditorWindow)); + } + } + private static void checkEditorValid2(Editor editor) { if (editor instanceof EditorWindow && !((EditorWindow)editor).isValid()) { throw new AssertionError(); @@ -295,11 +298,11 @@ public class CodeCompletionHandlerBase { boolean hasModifiers, int invocationCount, PsiFile hostFile, - int hostStartOffset, Editor hostEditor, OffsetMap hostMap, OffsetTranslator translator) { + Editor hostEditor, OffsetMap hostMap, OffsetTranslator translator) { final Editor editor = initContext.getEditor(); checkEditorValid2(editor); - CompletionContext context = createCompletionContext(hostFile, hostStartOffset, hostEditor, hostMap); + CompletionContext context = createCompletionContext(hostFile, hostMap.getOffset(CompletionInitializationContext.START_OFFSET), hostEditor, hostMap); CompletionParameters parameters = createCompletionParameters(invocationCount, context, editor); CompletionPhase phase = CompletionServiceImpl.getCompletionPhase(); @@ -502,15 +505,9 @@ public class CodeCompletionHandlerBase { } }); final PsiFile hostFile = InjectedLanguageUtil.getTopLevelFile(fileCopy[0]); - final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject()); - final int hostStartOffset = injectedLanguageManager.injectedToHost(fileCopy[0], initContext.getStartOffset()); final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(initContext.getEditor()); - final OffsetMap hostMap = new OffsetMap(hostEditor.getDocument()); - final OffsetMap original = initContext.getOffsetMap(); - for (final OffsetKey key : original.getAllOffsets()) { - hostMap.addOffset(key, injectedLanguageManager.injectedToHost(fileCopy[0], original.getOffset(key))); - } + final OffsetMap hostMap = translateOffsetMapToHost(initContext, fileCopy[0], hostFile, hostEditor); final Document document = fileCopy[0].getViewProvider().getDocument(); assert document != null : "no document"; @@ -550,17 +547,30 @@ public class CodeCompletionHandlerBase { Disposer.dispose(translator); return; } - doComplete(initContext, hasModifiers, invocationCount, hostFile, hostStartOffset, hostEditor, hostMap, translator); + doComplete(initContext, hasModifiers, invocationCount, hostFile, hostEditor, hostMap, translator); } }); } else { PsiDocumentManager.getInstance(hostFile.getProject()).commitDocument(hostDocument); - doComplete(initContext, hasModifiers, invocationCount, hostFile, hostStartOffset, hostEditor, hostMap, translator); + doComplete(initContext, hasModifiers, invocationCount, hostFile, hostEditor, hostMap, translator); } } + private OffsetMap translateOffsetMapToHost(CompletionInitializationContext initContext, + PsiFile context, + PsiFile hostFile, + Editor hostEditor) { + final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject()); + final OffsetMap hostMap = new OffsetMap(hostEditor.getDocument()); + final OffsetMap original = initContext.getOffsetMap(); + for (final OffsetKey key : original.getAllOffsets()) { + hostMap.addOffset(key, injectedLanguageManager.injectedToHost(context, original.getOffset(key))); + } + return hostMap; + } + private static CompletionContext createCompletionContext(PsiFile hostFile, int hostStartOffset, Editor hostEditor, @@ -581,11 +591,8 @@ public class CodeCompletionHandlerBase { EditorWindow injectedEditor = (EditorWindow)InjectedLanguageUtil .getEditorForInjectedLanguageNoCommit(hostEditor, hostFile, hostStartOffset); assert injected == injectedEditor.getInjectedFile(); - final OffsetMap map = new OffsetMap(injectedEditor.getDocument()); - for (final OffsetKey key : hostMap.getAllOffsets()) { - map.addOffset(key, injectedEditor.logicalPositionToOffset(injectedEditor.hostToInjected(hostEditor.offsetToLogicalPosition(hostMap.getOffset(key))))); - } - context = new CompletionContext(hostFile.getProject(), injectedEditor, injected, map); + context = new CompletionContext(hostFile.getProject(), injectedEditor, injected, + translateOffsetMapToInjected(hostEditor, hostMap, injectedEditor)); assert hostStartOffset == injectedLanguageManager.injectedToHost(injected, context.getStartOffset()) : "inconsistent injected offset translation"; } else { context = new CompletionContext(hostFile.getProject(), hostEditor, hostFile, hostMap); @@ -597,6 +604,14 @@ public class CodeCompletionHandlerBase { return context; } + private static OffsetMap translateOffsetMapToInjected(Editor hostEditor, OffsetMap hostMap, EditorWindow injectedEditor) { + final OffsetMap map = new OffsetMap(injectedEditor.getDocument()); + for (final OffsetKey key : hostMap.getAllOffsets()) { + map.addOffset(key, injectedEditor.logicalPositionToOffset(injectedEditor.hostToInjected(hostEditor.offsetToLogicalPosition(hostMap.getOffset(key))))); + } + return map; + } + private boolean isAutocompleteCommonPrefixOnInvocation() { return invokedExplicitly && CodeInsightSettings.getInstance().AUTOCOMPLETE_COMMON_PREFIX; } diff --git a/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java b/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java index c484f0be8920..71049b4ee7d7 100644 --- a/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java +++ b/platform/lang-impl/src/com/intellij/execution/RunManagerConfig.java @@ -25,6 +25,7 @@ public class RunManagerConfig { public static final String MAKE = ExecutionBundle.message("before.run.property.make"); private final StoringPropertyContainer myProperties; private final PropertiesComponent myPropertiesComponent; + public static final int MIN_RECENT_LIMIT = 0; @NonNls private static final String RECENTS_LIMIT = "recentsLimit"; @NonNls private static final String RESTART_REQUIRES_CONFIRMATION = "restartRequiresConfirmation"; @@ -36,7 +37,7 @@ public class RunManagerConfig { public int getRecentsLimit() { try { - return Math.max(1, Integer.valueOf(myPropertiesComponent.getOrInit(RECENTS_LIMIT, "5")).intValue()); + return Math.max(MIN_RECENT_LIMIT, Integer.valueOf(myPropertiesComponent.getOrInit(RECENTS_LIMIT, "5")).intValue()); } catch (NumberFormatException e) { return 5; diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index 985c751e65c5..d63d35f2d366 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -624,7 +624,7 @@ class RunConfigurable extends BaseConfigurable { } try { - int i = Math.max(1, Integer.parseInt(myRecentsLimit.getText())); + int i = Math.max(RunManagerConfig.MIN_RECENT_LIMIT, Integer.parseInt(myRecentsLimit.getText())); int oldLimit = manager.getConfig().getRecentsLimit(); if (oldLimit != i) { manager.getConfig().setRecentsLimit(i); diff --git a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java index bf8b74dc83be..820a56a66b9d 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java @@ -122,8 +122,6 @@ public abstract class AbstractConsoleRunnerWithHistory actions = fillToolBarActions(toolbarActions, defaultExecutor, contentDescriptor); registerActionShortcuts(actions, getLanguageConsole().getConsoleEditor().getComponent()); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java b/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java new file mode 100644 index 000000000000..49091867fdf8 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/impl/SyntheticFileSystemItem.java @@ -0,0 +1,165 @@ +/* + * @author max + */ +package com.intellij.psi.impl; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.search.PsiFileSystemItemProcessor; +import com.intellij.util.ArrayUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class SyntheticFileSystemItem extends PsiElementBase implements PsiFileSystemItem { + public static final Logger LOG = Logger.getInstance("#" + SyntheticFileSystemItem.class.getPackage().getName()); + + protected final Project myProject; + protected final PsiManager myManager; + + public SyntheticFileSystemItem(Project project) { + myProject = project; + myManager = PsiManager.getInstance(myProject); + } + + protected static boolean processFileSystemItem(PsiElementProcessor processor, PsiFileSystemItem element) { + if (processor instanceof PsiFileSystemItemProcessor && !((PsiFileSystemItemProcessor)processor).acceptItem(element.getName(), true)) { + return true; + } + + return processor.execute(element); + } + + public boolean isDirectory() { + return true; + } + + public ASTNode getNode() { + return null; + } + + public boolean isPhysical() { + return true; + } + + public boolean isWritable() { + return true; + } + + public boolean isValid() { + final VirtualFile virtualFile = getVirtualFile(); + return virtualFile != null && virtualFile.isValid(); + } + + public PsiElement replace(@NotNull final PsiElement newElement) throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be changed"); + } + + public void checkDelete() throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be deleted"); + } + + public void delete() throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be deleted"); + } + + public void accept(@NotNull final PsiElementVisitor visitor) { + // TODO + } + + @NotNull + public PsiElement[] getChildren() { + final PsiElementProcessor.CollectElements collector = new PsiElementProcessor.CollectElements(); + processChildren(collector); + return collector.toArray(new PsiFileSystemItem[0]); + } + + public PsiManager getManager() { + return myManager; + } + + @NotNull + public Language getLanguage() { + return Language.ANY; + } + + public void checkSetName(final String name) throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be renamed"); + } + + public PsiElement setName(@NonNls @NotNull final String name) throws IncorrectOperationException { + throw new IncorrectOperationException("Frameworks cannot be renamed"); + } + + @Nullable + public PsiFile getContainingFile() { + return null; + } + + @Nullable + public TextRange getTextRange() { + return null; + } + + public int getStartOffsetInParent() { + return -1; + } + + public int getTextLength() { + return -1; + } + + public PsiElement findElementAt(int offset) { + return null; + } + + public int getTextOffset() { + return -1; + } + + @Nullable + public String getText() { + return null; + } + + @NotNull + public char[] textToCharArray() { + return ArrayUtil.EMPTY_CHAR_ARRAY; // TODO throw new InsupportedOperationException() + } + + public boolean textMatches(@NotNull CharSequence text) { + return false; + } + + public boolean textMatches(@NotNull PsiElement element) { + return false; + } + + public PsiElement copy() { + LOG.error("method not implemented"); + return null; + } + + public PsiElement add(@NotNull PsiElement element) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } + + public PsiElement addBefore(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } + + public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } + + public void checkAdd(@NotNull PsiElement element) throws IncorrectOperationException { + throw new IncorrectOperationException(); + } +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java index e507b5c9824e..38aa026210fa 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java @@ -320,7 +320,9 @@ public class PsiVFSListener extends VirtualFileAdapter { myFileManager.setViewProvider(vFile, viewProvider); PsiFile newPsiFile = myManager.findFile(vFile); if (newPsiFile == null) { - LOG.error("null psi file for "+vFile+"; provider: "+viewProvider); + // psi file here can be null for any custom file with null parent + // that is currently open in a file editor, e.g. db table editor + //LOG.error("null psi file for "+vFile+"; provider: "+viewProvider); return; } if (!viewProvider.isPhysical()) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java index 5a42c4244984..6629702a628d 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java @@ -215,6 +215,12 @@ public class FileReferenceSet { protected void reparse() { String str = myPathStringNonTrimmed; + final List referencesList = reparse(str, myStartInElement); + + myReferences = referencesList.toArray(new FileReference[referencesList.size()]); + } + + protected List reparse(String str, int startInElement) { final List referencesList = new ArrayList(); @@ -235,7 +241,7 @@ public class FileReferenceSet { if (str.equals(separatorString)) { final FileReference fileReference = - createFileReference(new TextRange(myStartInElement, myStartInElement + sepLen), index++, separatorString); + createFileReference(new TextRange(startInElement, startInElement + sepLen), index++, separatorString); referencesList.add(fileReference); } @@ -243,7 +249,7 @@ public class FileReferenceSet { final int nextSlash = str.indexOf(separatorString, currentSlash + sepLen); final String subreferenceText = nextSlash > 0 ? str.substring(currentSlash + sepLen, nextSlash) : str.substring(currentSlash + sepLen); final FileReference ref = createFileReference( - new TextRange(myStartInElement + currentSlash + sepLen, myStartInElement + (nextSlash > 0 ? nextSlash : str.length())), + new TextRange(startInElement + currentSlash + sepLen, startInElement + (nextSlash > 0 ? nextSlash : str.length())), index++, subreferenceText); referencesList.add(ref); @@ -251,8 +257,7 @@ public class FileReferenceSet { break; } } - - myReferences = referencesList.toArray(new FileReference[referencesList.size()]); + return referencesList; } public FileReference getReference(int index) { diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java index 530a40b3caad..7eeee210443a 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java @@ -22,13 +22,17 @@ package com.intellij.psi.stubs; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiUtilCore; @@ -397,26 +401,30 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe } } - public static Collection safeGet(@NotNull StubIndexKey indexKey, - @NotNull Key key, - @NotNull final Project project, - final GlobalSearchScope scope, - @NotNull Class requiredClass) { - Collection collection = getInstance().get(indexKey, key, project, scope); - for (Iterator iterator = collection.iterator(); iterator.hasNext(); ) { - Psi psi = iterator.next(); - if (!requiredClass.isInstance(psi)) { - iterator.remove(); + @Override + protected void reportStubPsiMismatch(Psi psi, VirtualFile file) { + VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); + if (faultyContainer != null) { + Document document = FileDocumentManager.getInstance().getDocument(file); + PsiFile psiFile = psi.getManager().findFile(file); - VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi); - LOG.error("Invalid stub element type in index: " + faultyContainer + ". found: " + psi); - if (faultyContainer != null && faultyContainer.isValid()) { - FileBasedIndex.getInstance().requestReindex(faultyContainer); - } + String msg = "Invalid stub element type in index: " + file; + msg += "; found: " + psi; + msg += "; file stamp: " + file.getModificationStamp(); + msg += "; file modCount: " + file.getModificationCount(); + if (document != null) { + msg += "; unsaved: " + FileDocumentManager.getInstance().isDocumentUnsaved(document); + msg += "; doc stamp: " + document.getModificationStamp(); + msg += "; committed: " + PsiDocumentManager.getInstance(psi.getProject()).isCommitted(document); } + if (psiFile != null) { + msg += "; psi stamp: " + psiFile.getModificationStamp(); + msg += "; viewProvider stamp: " + psiFile.getViewProvider().getModificationStamp(); + } + LOG.error(msg); + return; } - - return collection; - } + super.reportStubPsiMismatch(psi, file); + } } diff --git a/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTask.java b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTask.java new file mode 100644 index 000000000000..2e58ce737759 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTask.java @@ -0,0 +1,125 @@ +/* + * Copyright 2000-2013 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.tools; + +import com.intellij.execution.BeforeRunTask; +import com.intellij.execution.process.ProcessAdapter; +import com.intellij.execution.process.ProcessEvent; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Ref; +import com.intellij.util.concurrency.Semaphore; +import org.jdom.Element; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @author traff + */ +public abstract class AbstractToolBeforeRunTask + extends BeforeRunTask { + @NonNls private final static String ACTION_ID_ATTRIBUTE = "actionId"; + private static final Logger LOG = Logger.getInstance(AbstractToolBeforeRunTask.class); + protected String myToolActionId; + + public AbstractToolBeforeRunTask(Key providerId) { + super(providerId); + } + + @Nullable + public String getToolActionId() { + return myToolActionId; + } + + @Override + public void writeExternal(Element element) { + super.writeExternal(element); + if (myToolActionId != null) { + element.setAttribute(ACTION_ID_ATTRIBUTE, myToolActionId); + } + } + + @Override + public void readExternal(Element element) { + super.readExternal(element); + myToolActionId = element.getAttributeValue(ACTION_ID_ATTRIBUTE); + } + + @Override + public ToolBeforeRunTask clone() { + return (ToolBeforeRunTask)super.clone(); + } + + public void setToolActionId(String toolActionId) { + myToolActionId = toolActionId; + } + + public boolean isExecutable() { + return myToolActionId != null; + } + + public boolean execute(final DataContext context, final long executionId) { + final Semaphore targetDone = new Semaphore(); + final Ref result = new Ref(false); + + try { + ApplicationManager.getApplication().invokeAndWait(new Runnable() { + @Override + public void run() { + targetDone.down(); + boolean runToolResult = ToolAction.runTool(myToolActionId, context, null, executionId, new ProcessAdapter() { + @Override + public void processTerminated(ProcessEvent event) { + result.set(event.getExitCode() == 0); + targetDone.up(); + } + }); + if (!runToolResult) { + result.set(false); + targetDone.up(); + } + } + }, ModalityState.NON_MODAL); + } + catch (Exception e) { + LOG.error(e); + return false; + } + targetDone.waitFor(); + return result.get(); + } + + @Nullable + public T findCorrespondingTool() { + if (myToolActionId == null) { + return null; + } + List tools = getTools(); + for (T tool : tools) { + if (myToolActionId.equals(tool.getActionId())) { + return tool; + } + } + return null; + } + + protected abstract List getTools(); +} diff --git a/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTaskProvider.java b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTaskProvider.java new file mode 100644 index 000000000000..6df8eecfe2c2 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/tools/AbstractToolBeforeRunTaskProvider.java @@ -0,0 +1,93 @@ +/* + * Copyright 2000-2013 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.tools; + +import com.intellij.execution.BeforeRunTaskProvider; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.text.StringUtil; + +import javax.swing.*; + +/** + * @author traff + */ +public abstract class AbstractToolBeforeRunTaskProvider extends BeforeRunTaskProvider { + protected static final Logger LOG = Logger.getInstance("#" + ToolBeforeRunTaskProvider.class.getName()); + + @Override + public Icon getIcon() { + return AllIcons.General.ExternalToolsSmall; + } + + @Override + public boolean configureTask(RunConfiguration runConfiguration, T task) { + final ToolSelectDialog dialog = new ToolSelectDialog(runConfiguration.getProject(), task.getToolActionId(), createToolsPanel()); + dialog.show(); + if (!dialog.isOK()) { + return false; + } + boolean isModified = dialog.isModified(); + Tool selectedTool = dialog.getSelectedTool(); + LOG.assertTrue(selectedTool != null); + String selectedToolId = selectedTool.getActionId(); + String oldToolId = task.getToolActionId(); + if (oldToolId != null && oldToolId.equals(selectedToolId)) { + return isModified; + } + task.setToolActionId(selectedToolId); + return true; + } + + protected abstract BaseToolsPanel createToolsPanel(); + + @Override + public boolean canExecuteTask(RunConfiguration configuration, T task) { + return task.isExecutable(); + } + + @Override + public String getDescription(T task) { + final String actionId = task.getToolActionId(); + if (actionId == null) { + LOG.error("Null id"); + return ToolsBundle.message("tools.unknown.external.tool"); + } + Tool tool = task.findCorrespondingTool(); + if (tool == null) { + return ToolsBundle.message("tools.unknown.external.tool"); + } + String groupName = tool.getGroup(); + return ToolsBundle + .message("tools.before.run.description", StringUtil.isEmpty(groupName) ? tool.getName() : groupName + "/" + tool.getName()); + } + + @Override + public boolean isConfigurable() { + return true; + } + + @Override + public boolean executeTask(DataContext context, RunConfiguration configuration, ExecutionEnvironment env, T task) { + if (!task.isExecutable()) { + return false; + } + return task.execute(context, env.getExecutionId()); + } +} diff --git a/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java b/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java index cbbfeeebfa46..aaf941934147 100644 --- a/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java +++ b/platform/lang-impl/src/com/intellij/tools/ExternalToolsCheckinHandlerFactory.java @@ -80,7 +80,7 @@ public class ExternalToolsCheckinHandlerFactory extends CheckinHandlerFactory { if (item instanceof Tool) { id = ((Tool)item).getActionId(); } - final ToolSelectDialog dialog = new ToolSelectDialog(panel.getProject(), id); + final ToolSelectDialog dialog = new ToolSelectDialog(panel.getProject(), id, new ToolsPanel()); dialog.show(); if (!dialog.isOK()) { return; diff --git a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java index 632e80830f60..eff984ad2734 100644 --- a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java +++ b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTask.java @@ -15,104 +15,16 @@ */ package com.intellij.tools; -import com.intellij.execution.BeforeRunTask; -import com.intellij.execution.process.ProcessAdapter; -import com.intellij.execution.process.ProcessEvent; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Ref; -import com.intellij.util.concurrency.Semaphore; -import org.jdom.Element; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.Nullable; - import java.util.List; -public class ToolBeforeRunTask extends BeforeRunTask { - private static final Logger LOG = Logger.getInstance(ToolBeforeRunTask.class); - @NonNls private final static String ACTION_ID_ATTRIBUTE = "actionId"; - private String myToolActionId; +public class ToolBeforeRunTask extends AbstractToolBeforeRunTask { protected ToolBeforeRunTask() { super(ToolBeforeRunTaskProvider.ID); } - @Nullable - public String getToolActionId() { - return myToolActionId; - } - - public void setToolActionId(String toolActionId) { - myToolActionId = toolActionId; - } - - public boolean isExecutable() { - return myToolActionId != null; - } - @Override - public void writeExternal(Element element) { - super.writeExternal(element); - if (myToolActionId != null) { - element.setAttribute(ACTION_ID_ATTRIBUTE, myToolActionId); - } - } - - @Override - public void readExternal(Element element) { - super.readExternal(element); - myToolActionId = element.getAttributeValue(ACTION_ID_ATTRIBUTE); - } - - @Override - public ToolBeforeRunTask clone() { - return (ToolBeforeRunTask)super.clone(); - } - - public boolean execute(final DataContext context, final long executionId) { - final Semaphore targetDone = new Semaphore(); - final Ref result = new Ref(false); - - try { - ApplicationManager.getApplication().invokeAndWait(new Runnable() { - @Override - public void run() { - targetDone.down(); - boolean runToolResult = ToolAction.runTool(myToolActionId, context, null, executionId, new ProcessAdapter() { - @Override - public void processTerminated(ProcessEvent event) { - result.set(event.getExitCode() == 0); - targetDone.up(); - } - }); - if (!runToolResult) { - result.set(false); - targetDone.up(); - } - } - }, ModalityState.NON_MODAL); - } - catch (Exception e) { - LOG.error(e); - return false; - } - targetDone.waitFor(); - return result.get(); - } - - @Nullable - public Tool findCorrespondingTool() { - if (myToolActionId == null) { - return null; - } - List tools = ToolManager.getInstance().getTools(); - for (Tool tool : tools) { - if (myToolActionId.equals(tool.getActionId())) { - return tool; - } - } - return null; + protected List getTools() { + return ToolManager.getInstance().getTools(); } } diff --git a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java index 828e7add5cc7..678e0b6a7657 100644 --- a/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java +++ b/platform/lang-impl/src/com/intellij/tools/ToolBeforeRunTaskProvider.java @@ -15,21 +15,11 @@ */ package com.intellij.tools; -import com.intellij.execution.BeforeRunTaskProvider; import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.runners.ExecutionEnvironment; -import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.text.StringUtil; -import javax.swing.*; - -public class ToolBeforeRunTaskProvider extends BeforeRunTaskProvider { +public class ToolBeforeRunTaskProvider extends AbstractToolBeforeRunTaskProvider { static final Key ID = Key.create("ToolBeforeRunTask"); - private static final Logger LOG = Logger.getInstance("#" + ToolBeforeRunTaskProvider.class.getName()); - @Override public Key getId() { @@ -41,66 +31,13 @@ public class ToolBeforeRunTaskProvider extends BeforeRunTaskProvider() { + @Override + public void run(DataContext context) { + popup.showInBestPositionFor(context); + } + }); } }); } @@ -125,8 +154,9 @@ public class ShowFilePathAction extends AnAction { public static void show(final VirtualFile file, final MouseEvent e) { show(file, new ShowAction() { public void show(final ListPopup popup) { - if (!e.getComponent().isShowing()) return; - popup.show(new RelativePoint(e)); + if (e.getComponent().isShowing()) { + popup.show(new RelativePoint(e)); + } } }); } @@ -253,6 +283,7 @@ public class ShowFilePathAction extends AnAction { * * @param directory a directory to show in a file manager. */ + @SuppressWarnings("UnusedDeclaration") public static void openDirectory(@NotNull final File directory) { if (!directory.isDirectory()) return; try { diff --git a/platform/platform-impl/src/com/intellij/idea/SocketLock.java b/platform/platform-impl/src/com/intellij/idea/SocketLock.java index 7e15b46f7335..ecdf70aed992 100644 --- a/platform/platform-impl/src/com/intellij/idea/SocketLock.java +++ b/platform/platform-impl/src/com/intellij/idea/SocketLock.java @@ -161,7 +161,7 @@ public class SocketLock { if (result.contains(path)) { try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); - out.writeUTF(ACTIVATE_COMMAND + StringUtil.join(args, "\0")); + out.writeUTF(ACTIVATE_COMMAND + new File(".").getAbsolutePath() + "\0" + StringUtil.join(args, "\0")); out.flush(); String response = in.readUTF(); if (response.equals("ok")) { diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 8edb74113ee8..019aff2aa49e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -251,7 +251,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application invokeLater(new Runnable() { @Override public void run() { - final Project project = CommandLineProcessor.processExternalCommandLine(args, null); + final Project project = CommandLineProcessor.processExternalCommandLine(args.subList(1, args.size()), args.get(0)); final JFrame frame; if (project != null) { frame = (JFrame)WindowManager.getInstance().getIdeFrame(project); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java index 6c594ca60011..f2574bc66896 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualDirectoryImpl.java @@ -540,7 +540,7 @@ public class VirtualDirectoryImpl extends VirtualFileSystemEntry { Function verboseToString = new Function() { @Override public String fun(VirtualFileSystemEntry entry) { - return entry + " (" + entry.getClass() + ")"; + return entry + " (name: '" + entry.getName() + "')"; } }; String children = StringUtil.join(array, verboseToString, ","); diff --git a/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java b/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java index ed100e4dfed5..cbac00107c3b 100644 --- a/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java +++ b/platform/projectModel-impl/src/com/intellij/application/options/PathMacrosImpl.java @@ -17,7 +17,6 @@ package com.intellij.application.options; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathMacros; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.components.ExpandMacroToPathMap; import com.intellij.openapi.diagnostic.Logger; @@ -25,15 +24,13 @@ import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.NamedJDOMExternalizable; import com.intellij.openapi.util.RoamingTypeDisabled; import com.intellij.openapi.util.WriteExternalException; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import gnu.trove.THashSet; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.serialization.JpsGlobalLoader; import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.util.*; @@ -50,12 +47,9 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, private final ReentrantReadWriteLock myLock = new ReentrantReadWriteLock(); private final List myIgnoredMacros = ContainerUtil.createLockFreeCopyOnWriteList(); - @NonNls - public static final String MACRO_ELEMENT = "macro"; - @NonNls - public static final String NAME_ATTR = "name"; - @NonNls - public static final String VALUE_ATTR = "value"; + public static final String MACRO_ELEMENT = JpsGlobalLoader.PathVariablesSerializer.MACRO_TAG; + public static final String NAME_ATTR = JpsGlobalLoader.PathVariablesSerializer.NAME_ATTRIBUTE; + public static final String VALUE_ATTR = JpsGlobalLoader.PathVariablesSerializer.VALUE_ATTRIBUTE; @NonNls public static final String IGNORED_MACRO_ELEMENT = "ignoredMacro"; @@ -68,7 +62,7 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, @NonNls public static final String MODULE_DIR_MACRO_NAME = PathMacroUtil.MODULE_DIR_MACRO_NAME; @NonNls - public static final String USER_HOME_MACRO_NAME = "USER_HOME"; + public static final String USER_HOME_MACRO_NAME = PathMacroUtil.USER_HOME_NAME; private static final Set SYSTEM_MACROS = new HashSet(); @NonNls public static final String EXT_FILE_NAME = "path.macros"; @@ -207,13 +201,6 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, } } - public static Map getGlobalSystemMacros() { - final Map map = new HashMap(); - map.put(APPLICATION_HOME_MACRO_NAME, PathManager.getHomePath()); - map.put(USER_HOME_MACRO_NAME, getUserHome()); - return map; - } - @Override public boolean isIgnoredMacroName(@NotNull String macro) { return myIgnoredMacros.contains(macro); @@ -393,8 +380,4 @@ public class PathMacrosImpl extends PathMacros implements ApplicationComponent, myLock.readLock().unlock(); } } - - public static String getUserHome() { - return StringUtil.trimEnd(FileUtil.toSystemIndependentName(SystemProperties.getUserHome()), "/"); - } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java index d26e94ee61fd..ed5457116938 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java @@ -31,6 +31,7 @@ import com.intellij.openapi.vfs.VirtualFileSystem; import com.intellij.util.containers.FactoryMap; import org.jdom.Element; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.util.*; @@ -78,7 +79,7 @@ public class BasePathMacroManager extends PathMacroManager { public ExpandMacroToPathMap getExpandMacroMap() { ExpandMacroToPathMap result = new ExpandMacroToPathMap(); - for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { + for (Map.Entry entry : PathMacroUtil.getGlobalSystemMacros().entrySet()) { result.addMacroExpand(entry.getKey(), entry.getValue()); } getPathMacros().addMacroExpands(result); @@ -87,7 +88,7 @@ public class BasePathMacroManager extends PathMacroManager { protected ReplacePathToMacroMap getReplacePathMap() { ReplacePathToMacroMap result = new ReplacePathToMacroMap(); - for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { + for (Map.Entry entry : PathMacroUtil.getGlobalSystemMacros().entrySet()) { result.addMacroReplacement(entry.getValue(), entry.getKey()); } getPathMacros().addMacroReplacements(result); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java index af0f884d88aa..0c24492f264a 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ModulePathMacroManager.java @@ -50,7 +50,7 @@ public class ModulePathMacroManager extends BasePathMacroManager { if (!myModule.isDisposed()) { final String modulePath = PathMacroUtil.getModuleDir(myModule.getModuleFilePath()); - addFileHierarchyReplacements(result, PathMacrosImpl.MODULE_DIR_MACRO_NAME, modulePath, PathMacrosImpl.getUserHome()); + addFileHierarchyReplacements(result, PathMacrosImpl.MODULE_DIR_MACRO_NAME, modulePath, PathMacroUtil.getUserHome()); } return result; diff --git a/platform/util/src/com/intellij/openapi/util/RecursionManager.java b/platform/util/src/com/intellij/openapi/util/RecursionManager.java index 15c4c046c93a..c53185d06345 100644 --- a/platform/util/src/com/intellij/openapi/util/RecursionManager.java +++ b/platform/util/src/com/intellij/openapi/util/RecursionManager.java @@ -75,7 +75,7 @@ public class RecursionManager { public static RecursionGuard createGuard(@NonNls final String id) { return new RecursionGuard() { @Override - public T doPreventingRecursion(@NotNull Object key, boolean memoize, Computable computation) { + public T doPreventingRecursion(@NotNull Object key, boolean memoize, @NotNull Computable computation) { MyKey realKey = new MyKey(id, key); final CalculationStack stack = ourStack.get(); @@ -101,8 +101,6 @@ public class RecursionManager { } } - int oldHash = realKey.hashCode(); - final int sizeBefore = stack.progressMap.size(); stack.beforeComputation(realKey); final int sizeAfter = stack.progressMap.size(); @@ -122,17 +120,15 @@ public class RecursionManager { stack.afterComputation(realKey, sizeBefore, sizeAfter); } catch (Throwable e) { + //noinspection ThrowFromFinallyBlock throw new RuntimeException("Throwable in afterComputation", e); } stack.checkDepth("4"); - - if (oldHash != realKey.hashCode()) { - throw new AssertionError("Object has changed its hashCode: " + key); - } } } + @NotNull @Override public StackStamp markStack() { final int stamp = ourStack.get().reentrancyCount; @@ -144,6 +140,7 @@ public class RecursionManager { }; } + @NotNull @Override public List currentStack() { ArrayList result = new ArrayList(); @@ -168,8 +165,17 @@ public class RecursionManager { } private static class MyKey extends Pair { - public MyKey(String first, Object second) { - super(first, second); + private int myHashCode; + + public MyKey(String guardId, Object userObject) { + super(guardId, userObject); + // remember user object hashCode to ensure our internal maps consistency + myHashCode = guardId.hashCode() * 31 + userObject.hashCode(); + } + + @Override + public int hashCode() { + return myHashCode; } } @@ -266,10 +272,10 @@ public class RecursionManager { if (depth == 0) { intermediateCache.clear(); if (!key2ReentrancyDuringItsCalculation.isEmpty()) { - LOG.error("non-empty key2ReentrancyDuringItsCalculation: " + new HashMap(key2ReentrancyDuringItsCalculation)); + LOG.error("non-empty key2ReentrancyDuringItsCalculation: " + new HashMap(key2ReentrancyDuringItsCalculation)); } if (!toMemoize.isEmpty()) { - LOG.error("non-empty toMemoize: " + new HashSet(toMemoize)); + LOG.error("non-empty toMemoize: " + new HashSet(toMemoize)); } } diff --git a/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy b/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy index 6e4a2e1c5b0f..aed05ed3e93d 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy +++ b/platform/util/testSrc/com/intellij/openapi/util/RecursionManagerTest.groovy @@ -23,14 +23,14 @@ import junit.framework.TestCase; public class RecursionManagerTest extends TestCase { private final RecursionGuard myGuard = RecursionManager.createGuard("RecursionManagerTest"); - def prevent(String key, boolean memoize = true, Closure c) { + def prevent(Object key, boolean memoize = true, Closure c) { myGuard.doPreventingRecursion(key, memoize, c as Computable) } public void testPreventRecursion() { - assert "foo-return" == prevent("foo") { + assert "foo-return" == prevent(["foo"]) { assert "bar-return" == prevent("bar") { - assert null == prevent("foo") { "foo-return" } + assert null == prevent(["foo"]) { "foo-return" } return "bar-return" } return "foo-return" @@ -156,4 +156,27 @@ public class RecursionManagerTest extends TestCase { assert System.currentTimeMillis() - start < 10000 } + public void "test changing hash code doesn't crash RecursionManager"() { + def key = ["b"] + prevent(key) { + key << "a" + } + } + + public void "test exception from hashCode on exiting"() { + boolean fail = false + Object key = new Object() { + @Override + int hashCode() { + if (fail) { + throw new RuntimeException() + } + return super.hashCode() + } + } + prevent(key) { + fail = true + } + } + } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java index fa514f79e036..5cf102f6c260 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElementImpl.java @@ -214,7 +214,7 @@ public class DirDiffElementImpl implements DirDiffElement { } else if (myType == DiffType.TARGET) { myOperation = op == COPY_FROM ? DELETE : op == DELETE ? NONE : COPY_FROM; } else if (myType == DiffType.CHANGED) { - myOperation = op == MERGE ? COPY_FROM : op == COPY_FROM ? COPY_TO : MERGE; + myOperation = op == MERGE ? COPY_TO : op == COPY_TO ? COPY_FROM : MERGE; } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index e4987fe503f0..4841d4de6227 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1226,7 +1226,7 @@ object.notify.replace.quickfix=Replace with 'notifyAll()' safe.lock.problem.descriptor=''{0}'' should be locked in front of a ''try'' block and unlocked in the corresponding ''finally'' block #loc synchronized.method.problem.descriptor=Method ''{0}()'' declared #ref #loc synchronized.method.include.option=Include native methods -synchronized.method.ignore.synchronized.super.option=Ignore overrides synchronized methods +synchronized.method.ignore.synchronized.super.option=Ignore methods overriding a synchronized method synchronized.method.move.quickfix=Move synchronization into method thread.run.replace.quickfix=Replace with 'start()' volatile.field.problem.descriptor=Volatile field #ref of type ''{0}'' #loc @@ -1713,6 +1713,7 @@ logging.condition.disagrees.with.log.statement.problem.descriptor=Logging condit log.statement.guarded.by.log.condition.display.name=Log statement not guarded by log condition log.statement.guarded.by.log.condition.problem.descriptor=#ref() log statement not guarded by log condition #loc log.statement.guarded.by.log.condition.quickfix=Surround with log condition +log.statement.guarded.by.log.condition.flag.all.unguarded.option=Flag all unguarded log statements key.set.iteration.may.use.entry.set.display.name=Iteration over 'keySet()' may be replaced with 'entrySet()' iteration key.set.iteration.may.use.entry.set.problem.descriptor=Iteration over #ref may be replaced with 'entrySet()' iteration #loc key.set.iteration.may.use.entry.set.quickfix=Replace with 'entrySet()' iteration @@ -1897,6 +1898,7 @@ arrays.hash.code.quickfix=Replace with 'Arrays.hashCode()' method.can.be.variable.arity.method.display.name=Method can be variable arity method method.can.be.variable.arity.method.problem.descriptor=#ref() can be converted to variable arity method #loc method.can.be.variable.arity.method.ignore.byte.short.option=Ignore methods with a last parameter of type byte[] or short[] +method.can.be.variable.arity.method.ignore.overriding.methods=Ignore methods overriding a super method convert.to.variable.arity.method.quickfix=Convert to variable arity method mismatched.string.builder.query.update.display.name=Mismatched query and update of StringBuilder mismatched.string.builder.updated.problem.descriptor=Contents of {0} #ref are updated, but never queried #loc diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java index 8a773ed83bf9..95a1b73e0a11 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/logging/LogStatementGuardedByLogConditionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2012 Bas Leijdekkers + * Copyright 2008-2013 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.util.ui.CheckBox; import com.intellij.util.ui.FormBuilder; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; @@ -57,6 +58,9 @@ public class LogStatementGuardedByLogConditionInspection extends BaseInspection final List logMethodNameList = new ArrayList(); final List logConditionMethodNameList = new ArrayList(); + @SuppressWarnings("PublicField") + public boolean flagAllUnguarded = false; + public LogStatementGuardedByLogConditionInspection() { parseString(loggerMethodAndconditionMethodNames, logMethodNameList, logConditionMethodNameList); } @@ -84,6 +88,8 @@ public class LogStatementGuardedByLogConditionInspection extends BaseInspection InspectionGadgetsBundle.message("log.condition.text"))); panel.add(UiUtils.createAddRemovePanel(table), BorderLayout.CENTER); panel.add(FormBuilder.createFormBuilder().addLabeledComponent(classNameLabel, loggerClassNameField).getPanel(), BorderLayout.NORTH); + panel.add(new CheckBox(InspectionGadgetsBundle.message("log.statement.guarded.by.log.condition.flag.all.unguarded.option"), + this, "flagAllUnguarded"), BorderLayout.SOUTH); return panel; } @@ -215,9 +221,17 @@ public class LogStatementGuardedByLogConditionInspection extends BaseInspection if (arguments.length == 0) { return; } - final PsiExpression firstArgument = arguments[0]; - if (PsiUtil.isConstantExpression(firstArgument)) { - return; + if (!flagAllUnguarded) { + boolean constant = true; + for (PsiExpression argument : arguments) { + if (!PsiUtil.isConstantExpression(argument)) { + constant = false; + break; + } + } + if (constant) { + return; + } } registerMethodCallError(expression); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java index 1c171d52fc5d..f4ea3c7365a2 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 Bas Leijdekkers + * Copyright 2011-2013 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ package com.siyeh.ig.migration; import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.search.searches.SuperMethodsSearch; import com.intellij.psi.util.PsiUtil; -import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -36,26 +36,30 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { @SuppressWarnings({"PublicField"}) public boolean ignoreByteAndShortArrayParameters = false; + @SuppressWarnings("PublicField") + public boolean ignoreOverridingMethods = false; + @Nls @NotNull @Override public String getDisplayName() { - return InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.display.name"); + return InspectionGadgetsBundle.message("method.can.be.variable.arity.method.display.name"); } @NotNull @Override protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.problem.descriptor"); + return InspectionGadgetsBundle.message("method.can.be.variable.arity.method.problem.descriptor"); } @Override public JComponent createOptionsPanel() { - return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( - "method.can.be.variable.arity.method.ignore.byte.short.option"), - this, "ignoreByteAndShortArrayParameters"); + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsBundle.message("method.can.be.variable.arity.method.ignore.byte.short.option"), + "ignoreByteAndShortArrayParameters"); + panel.addCheckbox(InspectionGadgetsBundle.message("method.can.be.variable.arity.method.ignore.overriding.methods"), + "ignoreOverridingMethods"); + return panel; } @Override @@ -63,19 +67,16 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return new MethodCanBeVariableArityMethodFix(); } - private static class MethodCanBeVariableArityMethodFix - extends InspectionGadgetsFix { + private static class MethodCanBeVariableArityMethodFix extends InspectionGadgetsFix { @NotNull @Override public String getName() { - return InspectionGadgetsBundle.message( - "convert.to.variable.arity.method.quickfix"); + return InspectionGadgetsBundle.message("convert.to.variable.arity.method.quickfix"); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { + protected void doFix(Project project, ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); final PsiElement parent = element.getParent(); if (!(parent instanceof PsiMethod)) { @@ -87,19 +88,15 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = - parameters[parameters.length - 1]; + final PsiParameter lastParameter = parameters[parameters.length - 1]; final PsiType type = lastParameter.getType(); if (!(type instanceof PsiArrayType)) { return; } final PsiArrayType arrayType = (PsiArrayType)type; final PsiType componentType = arrayType.getComponentType(); - final PsiElementFactory factory = - JavaPsiFacade.getElementFactory(project); - final PsiTypeElement newTypeElement = - factory.createTypeElementFromText( - componentType.getCanonicalText() + "...", method); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + final PsiTypeElement newTypeElement = factory.createTypeElementFromText(componentType.getCanonicalText() + "...", method); final PsiTypeElement typeElement = lastParameter.getTypeElement(); if (typeElement != null) { typeElement.replace(newTypeElement); @@ -112,8 +109,7 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return new MethodCanBeVariableArityMethodVisitor(); } - private class MethodCanBeVariableArityMethodVisitor - extends BaseInspectionVisitor { + private class MethodCanBeVariableArityMethodVisitor extends BaseInspectionVisitor { @Override public void visitMethod(PsiMethod method) { @@ -126,8 +122,7 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = - parameters[parameters.length - 1]; + final PsiParameter lastParameter = parameters[parameters.length - 1]; final PsiType type = lastParameter.getType(); if (!(type instanceof PsiArrayType)) { return; @@ -142,14 +137,16 @@ public class MethodCanBeVariableArityMethodInspection extends BaseInspection { return; } if (ignoreByteAndShortArrayParameters) { - if (PsiType.BYTE.equals(componentType) || - PsiType.SHORT.equals(componentType)) { + if (PsiType.BYTE.equals(componentType) || PsiType.SHORT.equals(componentType)) { return; } } if (LibraryUtil.isOverrideOfLibraryMethod(method)) { return; } + if (ignoreOverridingMethods && SuperMethodsSearch.search(method, null, true, false).findFirst() != null) { + return; + } registerMethodError(method); } } diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html b/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html index bc16a72efc06..f031fc967795 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/LogStatementGuardedByLogCondition.html @@ -9,10 +9,13 @@ least serious level (trace, debug, finest) of logging statements, because those most often disabled in a production environment.

-Use the text field below to specify the logger class name used. Use the table -to specify the log methods this inspection should warn on, with the corresponding +Use the text field below to specify the logger class name used. +

+Use the table to specify the log methods this inspection should warn on, with the corresponding logging condition text.

+Use the checkbox below to let this inspection flag all unguarded log statements, not only those with non-constant arguments. +

New in 8, Powered by InspectionGadgets \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html b/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html index 62d61cd226cd..4445fa8fcb39 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/MethodCanBeVariableArityMethod.html @@ -7,6 +7,10 @@ This inspection only reports if the project or module is configured to use a language level of 5.0 or higher.

+Use the first checkbox below to not offer to convert byte[] or short[] parameters to vararg. +

+Use the second checkbox below to ignore methods overriding a method in a super class. +

New in 10.5, Powered by InspectionGadgets \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java index b8f4f8c43443..dfb8c65cc7e0 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/LogStatementGuardedByLogCondition.java @@ -32,6 +32,10 @@ public class LogStatementGuardedByLogCondition { } } + void alternativeDebugMethodSignature(int i) { + LOG.debug(i, "asdfasdf"); + } + static class Logger { public Logger(String log) { @@ -40,6 +44,8 @@ public class LogStatementGuardedByLogCondition { public void debug(String s) { } + public void debug(int i, String s) {} + public void trace(String s) {} public boolean isDebug() { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml index e04e666cf360..701ef7837e72 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/logging/log_statement_guarded_by_log_condition/expected.xml @@ -14,4 +14,11 @@ Log statement not guarded by log condition <code>debug()</code> log statement not guarded by log condition #loc + + + LogStatementGuardedByLogCondition.java + 36 + Log statement not guarded by log condition + <code>debug()</code> log statement not guarded by log condition #loc + \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java index 4fd8268a94fe..db74d0cfc230 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/method_can_be_variable_arity_method/MethodCanBeVariableArity.java @@ -17,4 +17,11 @@ abstract class MyInputStream extends Reader { public int read(char[] cbuf) throws IOException { return super.read(cbuf); } +} +class Sub extends MethodCanBeVariableArity { + + @Override + public void convertMe(String[] ss) { + super.convertMe(ss); + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java index b07f6920fb2e..a54bd64d3b47 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/MethodCanBeVariableArityMethodInspectionTest.java @@ -5,10 +5,9 @@ import com.siyeh.ig.IGInspectionTestCase; public class MethodCanBeVariableArityMethodInspectionTest extends IGInspectionTestCase { public void test() throws Exception { - final MethodCanBeVariableArityMethodInspection tool = - new MethodCanBeVariableArityMethodInspection(); + final MethodCanBeVariableArityMethodInspection tool = new MethodCanBeVariableArityMethodInspection(); tool.ignoreByteAndShortArrayParameters = true; - doTest("com/siyeh/igtest/migration/method_can_be_variable_arity_method", - tool); + tool.ignoreOverridingMethods = true; + doTest("com/siyeh/igtest/migration/method_can_be_variable_arity_method", tool); } } \ No newline at end of file diff --git a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java index 78d443bd4773..a05a24426dc9 100644 --- a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java +++ b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjector.java @@ -41,6 +41,7 @@ import org.intellij.plugins.intelliLang.inject.config.AbstractTagInjection; import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.intellij.plugins.intelliLang.inject.config.InjectionPlace; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.regex.Pattern; @@ -227,8 +228,8 @@ public final class XmlLanguageInjector implements MultiHostInjector { private static boolean areThereInjectionsWithText(final String text, Trinity> index) { if (text == null) return false; if (index.third.contains(text)) return true; - if (index.second.matcher(text).matches()) return true; - return false; + Pattern pattern = index.second; + return pattern != null && pattern.matcher(text).matches(); } private Trinity> getXmlAnnotatedElementsValue() { @@ -248,6 +249,7 @@ public final class XmlLanguageInjector implements MultiHostInjector { return index; } + @Nullable private static Pattern buildPattern(Collection stringSet) { final StringBuilder sb = new StringBuilder(); for (String s : stringSet) { @@ -255,7 +257,7 @@ public final class XmlLanguageInjector implements MultiHostInjector { if (sb.length() > 0) sb.append('|'); sb.append("(?:").append(s).append(")"); } - return Pattern.compile(sb.toString()); + return sb.length() == 0 ? null : Pattern.compile(sb.toString()); } } diff --git a/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java b/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java index 1db18840e793..ca5dc045265f 100644 --- a/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java +++ b/plugins/ant/jps-plugin/src/org/jetbrains/jps/ant/model/impl/JpsAntInstallationImpl.java @@ -34,7 +34,7 @@ public class JpsAntInstallationImpl extends JpsElementBase myClasspath; private final List myJarDirectories; - public static final JpsElementChildRoleBase ROLE = JpsElementChildRoleBase.create("ant installation"); + private static final JpsElementChildRoleBase ROLE = JpsElementChildRoleBase.create("ant installation"); public static final JpsElementCollectionRole COLLECTION_ROLE = JpsElementCollectionRole.create(ROLE); public JpsAntInstallationImpl(File antHome, String name, final List classpath, List jarDirectories) { diff --git a/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java b/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java index a2b43bb75b03..426604fdfe97 100644 --- a/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java +++ b/plugins/ant/jps-plugin/testSrc/org/jetbrains/jps/ant/JpsAntArtifactBuilderTaskTest.java @@ -21,11 +21,11 @@ import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.incremental.artifacts.ArtifactBuilderTestCase; import org.jetbrains.jps.model.serialization.JpsGlobalLoader; +import org.jetbrains.jps.model.serialization.JpsModelSerializationDataService; import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.io.File; import java.io.IOException; -import java.util.Collections; import java.util.Map; import static com.intellij.util.io.TestFileSystemBuilder.fs; @@ -43,8 +43,8 @@ public class JpsAntArtifactBuilderTaskTest extends ArtifactBuilderTestCase { } public void testSimple() throws IOException { - Map pathVariables = Collections.singletonMap(PathMacroUtil.APPLICATION_HOME_DIR, PathManager.getHomePath()); - JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), pathVariables, getTestDataRootPath() + "/config/options"); + JpsModelSerializationDataService.getOrCreatePathVariablesConfiguration(myModel.getGlobal()).addPathVariable(PathMacroUtil.APPLICATION_HOME_DIR, PathManager.getHomePath()); + JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), getTestDataRootPath() + "/config/options"); addJdk("1.6"); loadProject("ant-project"); rebuildAll(); diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java index 61618146bdab..06d1bfe26509 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java @@ -299,8 +299,11 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement final Module module = moduleModel.newModule(modulesDirectory + "/" + EclipseProjectFinder.findProjectName(path) + IdeaXml.IML_EXT, StdModuleTypes.JAVA.getId()); result.add(module); - module2NatureNames.put(module, collectNatures(path)); + final Set natures = collectNatures(path); + if (natures.size() > 0) { + module2NatureNames.put(module, natures); + } final ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); rootModels[idx++] = rootModel; @@ -407,6 +410,9 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement private static void scheduleNaturesImporting(@NotNull final Project project, @NotNull final Map> module2NatureNames) { + if (module2NatureNames.size() == 0) { + return; + } ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { diff --git a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java index 95a165676c0f..3d6b64182590 100644 --- a/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java +++ b/plugins/generate-tostring/src/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspection.java @@ -33,12 +33,10 @@ import javax.swing.text.Document; import java.awt.*; /** - * Intention to check if the current class overrides the toString() method. + * Inspection to check if the current class overrides the toString() method. *

- * This inspection will use filter information from the settings to exclude certain fields (eg. constants etc.). - *

- * This inspection will only perform inspection if the class have fields to be dumped but - * does not have a toString method. + * This inspection will use filter information from the GenerateToString plugin settings to exclude certain fields (eg. constants etc.). + * Warns if the class has fields to be dumped and does not have a toString method. */ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspection { @@ -55,6 +53,8 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti public boolean excludeTestCode = false; + public boolean excludeInnerClasses = false; + @NotNull public String getDisplayName() { return "Class does not override 'toString()' method"; @@ -74,35 +74,27 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti if (log.isDebugEnabled()) log.debug("checkClass: clazz=" + clazz); // must be a class - PsiIdentifier nameIdentifier = clazz.getNameIdentifier(); - if (nameIdentifier == null || clazz.getName() == null) - return; + final PsiIdentifier nameIdentifier = clazz.getNameIdentifier(); + if (nameIdentifier == null || clazz.getName() == null) { + return; + } - // must not be an exception if (excludeException && InheritanceUtil.isInheritor(clazz, CommonClassNames.JAVA_LANG_THROWABLE)) { - log.debug("This class is an exception"); return; } - - // must not be deprecated if (excludeDeprecated && clazz.isDeprecated()) { - log.debug("Class is deprecated"); return; } - - // must not be enum if (excludeEnum && clazz.isEnum()) { - log.debug("Class is an enum"); return; } - if (excludeAbstract && clazz.hasModifierProperty(PsiModifier.ABSTRACT)) { - log.debug("Class is abstract"); return; } - if (excludeTestCode && TestFrameworks.getInstance().isTestClass(clazz)) { - log.debug("Class is test class"); + return; + } + if (excludeInnerClasses && clazz.getContainingClass() != null) { return; } @@ -110,7 +102,6 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti if (StringUtil.isNotEmpty(excludeClassNames)) { String name = clazz.getName(); if (name != null && name.matches(excludeClassNames)) { - log.debug("This class is excluded"); return; } } @@ -118,7 +109,6 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti // must have fields PsiField[] fields = clazz.getFields(); if (fields.length == 0) { - log.debug("Class does not have any fields"); return; } @@ -155,8 +145,6 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti return; } } - if (log.isDebugEnabled()) log.debug("Class does not override toString() method: " + clazz.getQualifiedName()); - holder.registerProblem(nameIdentifier, "Class '" + clazz.getName() + "' does not override 'toString()' method", ProblemHighlightType.GENERIC_ERROR_OR_WARNING, GenerateToStringQuickFix.getInstance()); } @@ -227,9 +215,13 @@ public class ClassHasNoToStringMethodInspection extends AbstractToStringInspecti final CheckBox excludeInTestCodeCheckBox = new CheckBox("Ignore test classes", this, "excludeTestCode"); constraints.gridy = 5; - constraints.weighty = 1.0; panel.add(excludeInTestCodeCheckBox, constraints); + final CheckBox excludeInnerClasses = new CheckBox("Ignore inner classes", this, "excludeInnerClasses"); + constraints.gridy = 6; + constraints.weighty = 1.0; + panel.add(excludeInnerClasses, constraints); + return panel; } } diff --git a/plugins/generate-tostring/testSrc/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspectionTest.java b/plugins/generate-tostring/testSrc/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspectionTest.java new file mode 100644 index 000000000000..32f131c16645 --- /dev/null +++ b/plugins/generate-tostring/testSrc/org/jetbrains/generate/tostring/inspection/ClassHasNoToStringMethodInspectionTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2013 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.generate.tostring.inspection; + +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NonNls; + +/** + * @author Bas Leijdekkers + */ +public class ClassHasNoToStringMethodInspectionTest extends LightCodeInsightFixtureTestCase { + + public void testBasic() { + doTest("class X {" + + " private int i = 0;" + + "}"); + } + + public void testDoNotWarnOnInnerClass() { + doTest("class X {" + + " class Inner {" + + " private int i = 0;" + + " }" + + "}"); + } + + private void doTest(@NonNls String text) { + myFixture.configureByText("X.java", text); + final ClassHasNoToStringMethodInspection inspection = new ClassHasNoToStringMethodInspection(); + inspection.excludeInnerClasses = true; + myFixture.enableInspections(inspection); + myFixture.testHighlighting(true, false, false); + } +} diff --git a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template index a30765f6a90a..aca22e95f99b 100644 --- a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template +++ b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/after.groovy.template @@ -1,3 +1,2 @@ -def ArrayList getDigits() { - return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -} \ No newline at end of file +print 'first line\n' + + 'second line' \ No newline at end of file diff --git a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template index a4d2f148943b..4bfcc8b50edb 100644 --- a/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template +++ b/plugins/groovy/resources/intentionDescriptions/GrBreakStringOnLineBreaksIntention/before.groovy.template @@ -1,3 +1 @@ -def getDigits() { - return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -} \ No newline at end of file +print 'first line\nsecond line' \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java index 85f0c12e0b08..63806a577a06 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/CustomMembersGenerator.java @@ -53,7 +53,7 @@ public class CustomMembersGenerator extends GroovyObjectSupport implements GdslM private static final Logger LOG = Logger.getInstance("#org.jetbrains.plugins.groovy.dsl.CustomMembersGenerator"); private static final GdslMembersProvider[] PROVIDERS = GdslMembersProvider.EP_NAME.getExtensions(); public static final String THROWS = "throws"; - private final Set myDeclarations = new HashSet(); + private final List myDeclarations = ContainerUtil.newArrayList(); private final Project myProject; private final CompoundMembersHolder myDepot = new CompoundMembersHolder(); private final GroovyClassDescriptor myDescriptor; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java index 51c96c69961f..df3609da7ba0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/holders/NonCodeMembersHolder.java @@ -31,7 +31,10 @@ import org.jetbrains.plugins.groovy.lang.completion.closureParameters.ClosureDes import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightVariable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; /** * @author peter @@ -41,11 +44,11 @@ public class NonCodeMembersHolder implements CustomMembersHolder { public static final Key DOCUMENTATION_URL = Key.create("GdslDocumentationUrl"); private final List myDeclarations = new ArrayList(); - public static NonCodeMembersHolder generateMembers(Set methods, final PsiFile place) { - Map, NonCodeMembersHolder> map = CachedValuesManager.getManager(place.getProject()).getCachedValue( - place, new CachedValueProvider, NonCodeMembersHolder>>() { - public Result, NonCodeMembersHolder>> compute() { - final Map, NonCodeMembersHolder> map = new ConcurrentSoftHashMap, NonCodeMembersHolder>(); + public static NonCodeMembersHolder generateMembers(List methods, final PsiFile place) { + Map, NonCodeMembersHolder> map = CachedValuesManager.getManager(place.getProject()).getCachedValue( + place, new CachedValueProvider, NonCodeMembersHolder>>() { + public Result, NonCodeMembersHolder>> compute() { + final Map, NonCodeMembersHolder> map = new ConcurrentSoftHashMap, NonCodeMembersHolder>(); return Result.create(map, PsiModificationTracker.MODIFICATION_COUNT); } }); @@ -57,7 +60,7 @@ public class NonCodeMembersHolder implements CustomMembersHolder { return result; } - private NonCodeMembersHolder(Set data, PsiElement place) { + private NonCodeMembersHolder(List data, PsiElement place) { final PsiManager manager = place.getManager(); for (Map prop : data) { final Object decltype = prop.get("declarationType"); @@ -78,7 +81,7 @@ public class NonCodeMembersHolder implements CustomMembersHolder { } } - private PsiElement createVariable(Map prop, PsiElement place, PsiManager manager) { + private static PsiElement createVariable(Map prop, PsiElement place, PsiManager manager) { String name = String.valueOf(prop.get("name")); final String type = String.valueOf(prop.get("type")); return new GrLightVariable(manager, name, type, Collections.emptyList(), place.getContainingFile()); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java index 1e26f828be24..10b3b40ba281 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/JavaStylePropertiesInvocationIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.intentions.base.ErrorUtil; import org.jetbrains.plugins.groovy.intentions.base.Intention; import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; @@ -48,7 +49,7 @@ public class JavaStylePropertiesInvocationIntention extends Intention { protected PsiElementPredicate getElementPredicate() { return new PsiElementPredicate() { public boolean satisfiedBy(PsiElement element) { - return element instanceof GrMethodCall && isPropertyAccessor((GrMethodCall)element); + return element instanceof GrMethodCall && isPropertyAccessor((GrMethodCall)element) && !ErrorUtil.containsError(element); } }; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java index c13b8aecec70..73f173928343 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java @@ -100,12 +100,16 @@ public class GroovyClassNameInsertHandler implements InsertHandler inheritors = new ArrayList(); - for (GrReferenceList list : StubIndexImpl.safeGet(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope, + for (GrReferenceList list : StubIndex.getInstance().safeGet(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope, GrReferenceList.class)) { final PsiElement parent = list.getParent(); if (parent instanceof GrTypeDefinition) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java index e3b06dde8174..113b85672dc0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java @@ -16,6 +16,8 @@ package org.jetbrains.plugins.groovy.lang.resolve; +import com.intellij.diagnostic.LogMessageEx; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Key; @@ -83,6 +85,8 @@ import static org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.getSmartReturnT */ @SuppressWarnings({"StringBufferReplaceableByString"}) public class ResolveUtil { + private static final Logger LOG = Logger.getInstance(ResolveUtil.class); + public static final PsiScopeProcessor.Event DECLARATION_SCOPE_PASSED = new PsiScopeProcessor.Event() {}; private ResolveUtil() { @@ -114,6 +118,7 @@ public class ResolveUtil { @NotNull final PsiScopeProcessor processor, boolean processNonCodeMethods, @NotNull final ResolveState state) { + try { ClassHint hint = processor.getHint(ClassHint.KEY); if (hint != null) { return new DeclarationCacheKey(getNameHint(processor), hint, processNonCodeMethods, originalPlace).processCachedDeclarations(place, processor); @@ -131,6 +136,11 @@ public class ResolveUtil { return true; } }); + } + catch (StackOverflowError e) { + LogMessageEx.error(LOG, "StackOverflow", e, place.getContainingFile().getText()); + throw e; + } } static boolean doProcessDeclarations(@NotNull PsiElement place, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java index 4e1d21d756fa..7198f2a1ba47 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java @@ -24,7 +24,6 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.stubs.StubIndex; -import com.intellij.psi.stubs.StubIndexImpl; import com.intellij.util.ArrayUtil; import com.intellij.util.ObjectUtils; import com.intellij.util.Processor; @@ -97,8 +96,8 @@ public class GroovyShortNamesCache extends PsiShortNamesCache { private List addClasses(String name, GlobalSearchScope scope, boolean inSource) { final List result = new ArrayList(getScriptClassesByFQName(name, scope, inSource)); - for (PsiElement psiClass : StubIndexImpl.safeGet(GrFullClassNameIndex.KEY, name.hashCode(), myProject, - inSource ? new GrSourceFilterScope(scope) : scope, PsiClass.class)) { + for (PsiElement psiClass : StubIndex.getInstance().safeGet(GrFullClassNameIndex.KEY, name.hashCode(), myProject, + inSource ? new GrSourceFilterScope(scope) : scope, PsiClass.class)) { //hashcode doesn't guarantee equals if (name.equals(((PsiClass)psiClass).getQualifiedName())) { result.add((PsiClass)psiClass); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties index af474f9692a3..8663a38115da 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringBundle.properties @@ -173,3 +173,4 @@ rename.groovy.method=Rename Groovy method cannot.inline.0.=Cannot inline {0} ref.0.will.not.be.resolved.outside.of.current.context=Reference ''{0}'' will not be resolved outside of current context cannot.rename.property.0=Cannot rename property ''{0}'' which overrides method ''{1}'' +cannot.inline.reference.0=Cannot inline reference ''{0}'' diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java index 2c12c6827eb0..326b0ccbe3e3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java @@ -82,7 +82,11 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { @Nullable public MultiMap getConflicts(@NotNull PsiReference reference, @NotNull PsiElement referenced) { PsiElement element = reference.getElement(); - assert element instanceof GrExpression && element.getParent() instanceof GrCallExpression; + if (!(element instanceof GrExpression && element.getParent() instanceof GrCallExpression)) { + final MultiMap map = new MultiMap(); + map.putValue(element, GroovyRefactoringBundle.message("cannot.inline.reference.0", element.getText())); + return map; + } GrCallExpression call = (GrCallExpression) element.getParent(); Collection infos = GroovyInlineMethodUtil.collectReferenceInfo(myMethod); return collectConflicts(call, infos); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java index 7bd62c3bb8ba..abf532318f13 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/DefaultGroovyScriptRunner.java @@ -97,7 +97,9 @@ public class DefaultGroovyScriptRunner extends GroovyScriptRunner { if (groovyHome != null) { groovyHome = FileUtil.toSystemDependentName(groovyHome); } - setGroovyHome(params, groovyHome); + if (groovyHome != null) { + setGroovyHome(params, groovyHome); + } final String confPath = getConfPath(groovyHome); params.getVMParametersList().add("-Dgroovy.starter.conf=" + confPath); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java index 8e91bc7d33dd..87ee64a6fff9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunner.java @@ -79,7 +79,7 @@ public abstract class GroovyScriptRunner { } } - protected static void setGroovyHome(JavaParameters params, String groovyHome) { + protected static void setGroovyHome(JavaParameters params, @NotNull String groovyHome) { params.getVMParametersList().add("-Dgroovy.home=" + groovyHome); if (groovyHome.contains("grails")) { //a bit of a hack params.getVMParametersList().add("-Dgrails.home=" + groovyHome); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy index acbafa991c33..b3153d178b5a 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/inline/InlineMethodTest.groovy @@ -23,6 +23,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.impl.source.codeStyle.CodeEditUtil import com.intellij.psi.impl.source.tree.TreeElement +import com.intellij.refactoring.BaseRefactoringProcessor import com.intellij.refactoring.inline.GenericInlineHandler import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture @@ -106,20 +107,31 @@ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { public void testBadReturns() { doTest() } public void testInlineAll() { + doInlineAllTest() + } + + private void doInlineAllTest() { doTest(new GroovyInlineHandler() { @Override public InlineHandler.Settings prepareInlineElement(PsiElement element, Editor editor, boolean invokedOnReference) { - return new InlineHandler.Settings() { - @Override - boolean isOnlyOneReferenceToInline() {false} - } + return { false } as InlineHandler.Settings } }) } - + public void testInlineNamedArgs() {doTest(); } public void testInlineVarargs() {doTest()} + public void testCannotInlineMethodRef() { + try { + doInlineAllTest() + assert false + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + assertEquals("Cannot inline reference 'new A().&foo'", e.message) + } + } + protected void doTest() { doTest(new GroovyInlineHandler()); } @@ -145,19 +157,19 @@ public class InlineMethodTest extends LightCodeInsightFixtureTestCase { GroovyPsiElement selectedArea = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrReferenceExpression.class); if (selectedArea == null) { - PsiElement identifier = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, PsiElement.class); - if (identifier != null) { - if (identifier.parent instanceof GrVariable) { - selectedArea = (GroovyPsiElement)identifier.parent; - } - else if (identifier instanceof GrMethod) { - selectedArea = identifier - } - else { - this.assertTrue("Selected area doesn't point to method or variable", false) + PsiElement identifier = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, PsiElement.class); + if (identifier != null) { + if (identifier.parent instanceof GrVariable) { + selectedArea = (GroovyPsiElement)identifier.parent; + } + else if (identifier instanceof GrMethod) { + selectedArea = identifier + } + else { + this.assertTrue("Selected area doesn't point to method or variable", false) + } } } - } Assert.assertNotNull("Selected area reference points to nothing", selectedArea); PsiElement element = selectedArea instanceof GrExpression ? selectedArea.reference.resolve() : selectedArea; Assert.assertNotNull("Cannot resolve selected reference expression", element); diff --git a/plugins/groovy/testdata/groovy/refactoring/inlineMethod/cannotInlineMethodRef.test b/plugins/groovy/testdata/groovy/refactoring/inlineMethod/cannotInlineMethodRef.test new file mode 100644 index 000000000000..d6469cc188ea --- /dev/null +++ b/plugins/groovy/testdata/groovy/refactoring/inlineMethod/cannotInlineMethodRef.test @@ -0,0 +1,7 @@ +class A { + def foo() {} +} + +new A().foo() +new A().&foo +----- diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java index 3ec2a6385bb2..ce2b38cd128b 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java @@ -136,6 +136,10 @@ public class JavaFXHighlightingTest extends DaemonAnalyzerTestCase { doTestNavigation("MyController", "label", "injected/" + getTestName(true) + ".fxml", "injected/FooVBox.java", "injected/MyController.java"); } + public void testNamedColor() throws Exception { + doTestNavigation(JavaFxCommonClassNames.JAVAFX_SCENE_COLOR, "ORANGE"); + } + private void doTestNavigation(String resultClassName, String resultFieldName) throws Exception { doTestNavigation(resultClassName, resultFieldName, ArrayUtil.EMPTY_STRING_ARRAY); } diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java index 296b93dd2ee7..199c3d2fa739 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCompletionTest.java @@ -109,6 +109,10 @@ public class JavaFxCompletionTest extends CompletionTestCase { doTest("stylesheets"); } + public void testNamedColors() throws Exception { + doTest("blue"); + } + public void testReadOnly() throws Exception { configureByFile(getTestName(true) + ".fxml"); assertTrue(myItems.length > 0); diff --git a/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml b/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml index af2e51d3b7bb..bd2763370200 100644 --- a/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml +++ b/plugins/javaFX/src/META-INF/common-javaFX-plugin.xml @@ -20,6 +20,7 @@ + org.jetbrains.plugins.javaFX.fxml.codeInsight.intentions.JavaFxCollapseSubTagToAttributeIntention JavaFX diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java index bc692f2339e5..f1d5cac979d0 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxControllerClassIndex.java @@ -132,7 +132,7 @@ public class JavaFxControllerClassIndex extends ScalarIndexExtension { } } - private static class MyInputFilter implements FileBasedIndex.InputFilter { + static class MyInputFilter implements FileBasedIndex.InputFilter { @Override public boolean acceptInput(final VirtualFile file) { return JavaFxFileTypeFactory.isFxml(file); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxIdsIndex.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxIdsIndex.java new file mode 100644 index 000000000000..00882449045b --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/JavaFxIdsIndex.java @@ -0,0 +1,175 @@ +/* + * Copyright 2000-2013 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.javaFX; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.CommonProcessors; +import com.intellij.util.indexing.*; +import com.intellij.util.io.DataExternalizer; +import com.intellij.util.io.EnumeratorStringDescriptor; +import com.intellij.util.io.KeyDescriptor; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; +import org.jetbrains.plugins.javaFX.fxml.JavaFXNamespaceProvider; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.io.StringReader; +import java.util.*; + +public class JavaFxIdsIndex extends FileBasedIndexExtension> { + + @NonNls public static final ID> KEY = ID.create("javafx.id.name"); + + private final KeyDescriptor myKeyDescriptor = new EnumeratorStringDescriptor(); + private final FileBasedIndex.InputFilter myInputFilter = new JavaFxControllerClassIndex.MyInputFilter(); + private final MyDataIndexer myDataIndexer = new MyDataIndexer(); + private final MyDataExternalizer myDataExternalizer = new MyDataExternalizer(); + + @NotNull + @Override + public DataIndexer, FileContent> getIndexer() { + return myDataIndexer; + } + + @Override + public DataExternalizer> getValueExternalizer() { + return myDataExternalizer; + } + + @Override + public FileBasedIndex.InputFilter getInputFilter() { + return myInputFilter; + } + + @NotNull + @Override + public ID> getName() { + return KEY; + } + + @Override + public KeyDescriptor getKeyDescriptor() { + return myKeyDescriptor; + } + + @Override + public boolean dependsOnFileContent() { + return true; + } + + @Override + public int getVersion() { + return 0; + } + + @NotNull + public static Collection getAllRegisteredIds(Project project) { + CommonProcessors.CollectUniquesProcessor processor = new CommonProcessors.CollectUniquesProcessor(); + FileBasedIndex.getInstance().processAllKeys(KEY, processor, project); + return processor.getResults(); + } + + @NotNull + public static Collection getFilePaths(Project project, String id) { + final List> values = FileBasedIndex.getInstance().getValues(KEY, id, GlobalSearchScope.projectScope(project)); + return (Collection)(values.isEmpty() ? Collections.emptySet() : values.get(0)); + } + + private static class MyDataIndexer implements DataIndexer, FileContent> { + private static final SAXParser SAX_PARSER = createParser(); + + private static SAXParser createParser() { + try { + return SAXParserFactory.newInstance().newSAXParser(); + } + catch (Exception e) { + return null; + } + } + + @Override + @NotNull + public Map> map(final FileContent inputData) { + final Map> map = getIds(inputData.getContentAsText().toString(), inputData.getFile().getPath()); + if (map != null) { + return map; + } + return Collections.emptyMap(); + } + + @Nullable + private static Map> getIds(String content, final String path) { + if (!content.contains(JavaFXNamespaceProvider.JAVAFX_NAMESPACE)) { + return null; + } + + final Map> map = new HashMap>(); + try { + SAX_PARSER.parse(new InputSource(new StringReader(content)), new DefaultHandler() { + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + final String attributesValue = attributes.getValue(FxmlConstants.FX_ID); + if (attributesValue != null) { + Set paths = map.get(attributesValue); + if (paths == null) { + paths = new HashSet(); + map.put(attributesValue, paths); + } + paths.add(path); + } + } + }); + } + catch (Exception e) { + // Do nothing. + } + + return map; + } + } + + private static class MyDataExternalizer implements DataExternalizer> { + @Override + public void save(DataOutput out, Set value) throws IOException { + out.writeInt(value.size()); + for (String s : value) { + out.writeUTF(s); + } + } + + @Override + public Set read(DataInput in) throws IOException { + final int size = in.readInt(); + final Set result = new HashSet(size); + + for (int i = 0; i < size; i++) { + final String s = in.readUTF(); + result.add(s); + } + return result; + } + } +} \ No newline at end of file diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java index 51f104370393..5e03303fb3eb 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxCommonClassNames.java @@ -35,6 +35,7 @@ public class JavaFxCommonClassNames { @NonNls public static final String JAVAFX_EVENT_EVENT_HANDLER = "javafx.event.EventHandler"; @NonNls public static final String JAVAFX_SCENE_NODE = "javafx.scene.Node"; @NonNls public static final String JAVAFX_SCENE_PAINT = "javafx.scene.paint.Paint"; + @NonNls public static final String JAVAFX_SCENE_COLOR = "javafx.scene.paint.Color"; @NonNls public static final String JAVAFX_FXML_BUILDER = "javafx.util.Builder"; @NonNls public static final String JAVAFX_BEANS_OBSERVABLE = "javafx.beans.Observable"; @NonNls public static final String VALUE_OF = "valueOf"; diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java index febd08f873ab..787a274c9230 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java @@ -100,6 +100,9 @@ public class FxmlReferencesContributor extends PsiReferenceContributor { registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().and(attributeValueInFxml), new EnumeratedAttributeReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().and(attributeValueInFxml), + new JavaFxColorReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue() .withParent(XmlPatterns.xmlAttribute().withName(FxmlConstants.FX_VALUE) .withParent(XmlPatterns.xmlTag().withParent(XmlPatterns.xmlTag().withName(FxmlConstants.STYLESHEETS)))) diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java index 9da83e9eee7a..2670e4d928e4 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxAnnotator.java @@ -28,19 +28,17 @@ import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.presentation.java.SymbolPresentationUtil; -import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.ui.ColorUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.ColorIcon; -import com.intellij.xml.XmlAttributeDescriptor; +import com.intellij.xml.util.ColorSampleLookupValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonClassNames; import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory; import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil; -import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxPropertyAttributeDescriptor; import javax.swing.*; import java.awt.*; @@ -70,11 +68,8 @@ public class JavaFxAnnotator implements Annotator { } } } - if (references.length == 0) { - final String attributeValueText = StringUtil.stripQuotesAroundValue(element.getText()); - if (attributeValueText.startsWith("#")) { - attachColorIcon(element, holder, attributeValueText); - } + if (references.length == 1 && references[0] instanceof JavaFxColorReference) { + attachColorIcon(element, holder, StringUtil.stripQuotesAroundValue(element.getText())); } } else if (element instanceof XmlAttribute) { final String attributeName = ((XmlAttribute)element).getName(); @@ -87,28 +82,23 @@ public class JavaFxAnnotator implements Annotator { } private static void attachColorIcon(final PsiElement element, AnnotationHolder holder, String attributeValueText) { - final PsiElement parent = element.getParent(); - if (parent instanceof XmlAttribute) { - final XmlAttributeDescriptor descriptor = ((XmlAttribute)parent).getDescriptor(); - if (descriptor instanceof JavaFxPropertyAttributeDescriptor) { - final PsiElement declaration = descriptor.getDeclaration(); - if (declaration instanceof PsiField) { - final PsiField field = (PsiField)declaration; - final PsiClassType propertyClassType = JavaFxPsiUtil.getPropertyClassType(field); - if (propertyClassType != null && InheritanceUtil.isInheritor(propertyClassType, JavaFxCommonClassNames.JAVAFX_SCENE_PAINT)) { - try { - final Color color = ColorUtil.fromHex(attributeValueText.substring(1)); - if (color != null) { - final ColorIcon icon = new ColorIcon(8, color); - final Annotation annotation = holder.createInfoAnnotation(element, null); - annotation.setGutterIconRenderer(new ColorIconRenderer(icon, element)); - } - } - catch (Exception ignored) { - } - } + try { + Color color = null; + if (attributeValueText.startsWith("#")) { + color = ColorUtil.fromHex(attributeValueText.substring(1)); + } else { + final String hexCode = ColorSampleLookupValue.getHexCodeForColorName(StringUtil.toLowerCase(attributeValueText)); + if (hexCode != null) { + color = ColorUtil.fromHex(hexCode); } } + if (color != null) { + final ColorIcon icon = new ColorIcon(8, color); + final Annotation annotation = holder.createInfoAnnotation(element, null); + annotation.setGutterIconRenderer(new ColorIconRenderer(icon, element)); + } + } + catch (Exception ignored) { } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReference.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReference.java new file mode 100644 index 000000000000..e3ac22476a13 --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReference.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2013 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.javaFX.fxml.refs; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.xml.util.ColorSampleLookupValue; +import com.intellij.xml.util.UserColorLookup; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonClassNames; + +/** + * User: anna + * Date: 3/7/13 + */ +public class JavaFxColorReference extends PsiReferenceBase { + public JavaFxColorReference(XmlAttributeValue value) { + super(value); + } + + @Nullable + @Override + public PsiElement resolve() { + final Project project = getElement().getProject(); + final PsiClass psiClass = + JavaPsiFacade.getInstance(project).findClass(JavaFxCommonClassNames.JAVAFX_SCENE_COLOR, GlobalSearchScope.allScope(project)); + if (psiClass != null) { + return psiClass.findFieldByName(getCanonicalText().toUpperCase(), false); + } + return null; + } + + @NotNull + @Override + public Object[] getVariants() { + final ColorSampleLookupValue[] lookupValues = ColorSampleLookupValue.getColors(); + final Object[] vars = new Object[lookupValues.length + 1]; + for (int i = 0; i < lookupValues.length; i++) { + final ColorSampleLookupValue value = lookupValues[i]; + vars[i] = new ColorSampleLookupValue(value.getName(), value.getValue(), true); + } + vars[lookupValues.length] = new UserColorLookup(); + return vars; + } + + @Override + public boolean isSoft() { + return true; + } +} diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReferenceProvider.java new file mode 100644 index 000000000000..d53f8752ec90 --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxColorReferenceProvider.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2013 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.javaFX.fxml.refs; + +import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.util.ProcessingContext; +import com.intellij.xml.XmlAttributeDescriptor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonClassNames; +import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil; +import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxPropertyAttributeDescriptor; + +/** +* User: anna +* Date: 3/7/13 +*/ +class JavaFxColorReferenceProvider extends PsiReferenceProvider { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, + @NotNull ProcessingContext context) { + final XmlAttributeValue attributeValue = (XmlAttributeValue)element; + final PsiElement parent = attributeValue.getParent(); + if (parent instanceof XmlAttribute) { + final XmlAttributeDescriptor descriptor = ((XmlAttribute)parent).getDescriptor(); + if (descriptor instanceof JavaFxPropertyAttributeDescriptor) { + final PsiElement declaration = descriptor.getDeclaration(); + if (declaration instanceof PsiField) { + final PsiField field = (PsiField)declaration; + final PsiClassType propertyClassType = JavaFxPsiUtil.getPropertyClassType(field); + if (propertyClassType != null && InheritanceUtil.isInheritor(propertyClassType, JavaFxCommonClassNames.JAVAFX_SCENE_PAINT)) { + return new PsiReference[] {new JavaFxColorReference(attributeValue)}; + } + } + } + } + return PsiReference.EMPTY_ARRAY; + } +} diff --git a/plugins/javaFX/testData/completion/namedColors.fxml b/plugins/javaFX/testData/completion/namedColors.fxml new file mode 100644 index 000000000000..dda432697fcb --- /dev/null +++ b/plugins/javaFX/testData/completion/namedColors.fxml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/completion/namedColors_after.fxml b/plugins/javaFX/testData/completion/namedColors_after.fxml new file mode 100644 index 000000000000..e1b752eca61d --- /dev/null +++ b/plugins/javaFX/testData/completion/namedColors_after.fxml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/plugins/javaFX/testData/highlighting/namedColor.fxml b/plugins/javaFX/testData/highlighting/namedColor.fxml new file mode 100644 index 000000000000..7322af9e0fb9 --- /dev/null +++ b/plugins/javaFX/testData/highlighting/namedColor.fxml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java index e7d65657d0b4..723ba6e14fa6 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/AddSchemaPrefixIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -86,7 +86,7 @@ public class AddSchemaPrefixIntention extends PsiElementBaseIntentionAction { tag.accept(new XmlRecursiveElementVisitor() { @Override public void visitXmlTag(XmlTag tag) { - if (namespace.equals(tag.getNamespace()) && tag.getNamespacePrefix().length() == 0) { + if (tag.getNamespace().equals(namespace) && tag.getNamespacePrefix().length() == 0) { tags.add(tag); } super.visitXmlTag(tag); @@ -109,7 +109,7 @@ public class AddSchemaPrefixIntention extends PsiElementBaseIntentionAction { if (xmlElement instanceof XmlElement) { final XmlTag tag = PsiTreeUtil.getParentOfType(xmlElement, XmlTag.class, false); if (tag != null) { - if (namespace.equals(tag.getNamespace())) { + if (tag.getNamespace().equals(namespace)) { if (ref.getRangeInElement().getLength() == value.getValue().length()) { //no ns prefix values.add(value); } diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java index 34c4809aa811..adfec6974ebc 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/ConvertSchemaPrefixToDefaultIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -92,6 +92,7 @@ public class ConvertSchemaPrefixToDefaultIntention extends PsiElementBaseIntenti } } for (XmlAttribute attr : attrs) { + //noinspection ConstantConditions attr.setValue(attr.getValue().substring(index)); } xmlns.setName("xmlns"); diff --git a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java index f024e874b2e7..36af0b3ccbe8 100644 --- a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java +++ b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -229,7 +229,7 @@ public class DefaultXmlExtension extends XmlExtension { rootTag.add(xmlAttribute); } else { final String value = xmlAttribute.getValue(); - if (!value.contains(namespace)) { + if (!StringUtil.notNullize(value).contains(namespace)) { if (StringUtil.isEmptyOrSpaces(value)) { xmlAttribute.setValue(pair); } else { diff --git a/xml/impl/src/com/intellij/xml/util/XmlUtil.java b/xml/impl/src/com/intellij/xml/util/XmlUtil.java index e9c8abd6c2ba..22f68453b560 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/XmlUtil.java @@ -197,15 +197,15 @@ public class XmlUtil { } @Nullable - public static String findNamespacePrefixByURI(XmlFile file, @NonNls String uri) { + public static String findNamespacePrefixByURI(XmlFile file, @NotNull @NonNls String uri) { final XmlTag tag = file.getRootTag(); if (tag == null) return null; for (XmlAttribute attribute : tag.getAttributes()) { - if (attribute.getName().startsWith("xmlns:") && attribute.getValue().equals(uri)) { + if (attribute.getName().startsWith("xmlns:") && uri.equals(attribute.getValue())) { return attribute.getName().substring("xmlns:".length()); } - if ("xmlns".equals(attribute.getName()) && attribute.getValue().equals(uri)) return ""; + if ("xmlns".equals(attribute.getName()) && uri.equals(attribute.getValue())) return ""; } return null; diff --git a/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java b/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java index 0ba6a7ef2719..442e53a46354 100644 --- a/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java +++ b/xml/openapi/src/com/intellij/psi/xml/XmlAttribute.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -42,11 +42,13 @@ public interface XmlAttribute extends XmlElement, PsiNamedElement { /** * @return text inside XML attribute with quotes stripped off */ + @Nullable String getValue(); /** * @return text inside XML attribute with quotes stripped off and XML char entities replaced with corresponding characters */ + @Nullable String getDisplayValue(); /**