diff --git a/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java b/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java index 464e6761a0eb..5e851f65886b 100644 --- a/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java +++ b/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java @@ -215,7 +215,8 @@ public class JavaLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSett " x--;\n" + " } while (x > 10) \n" + " }\n" + - " public static void test() { \n" + + " public static void test() \n" + + " throws Exception { \n" + " foo.foo().bar(\"arg1\", \n" + " \"arg2\"); \n" + " } \n" + diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java index 217cfa449d54..e6f14c03dc91 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java @@ -823,6 +823,7 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo if (role == ChildRole.TYPE_PARAMETER_LIST) return defaultAlignment; if (role == ChildRole.TYPE) return defaultAlignment; if (role == ChildRole.NAME) return defaultAlignment; + if (role == ChildRole.THROWS_LIST && mySettings.ALIGN_THROWS_KEYWORD) return defaultAlignment; return null; } diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index 044493afcecb..ca2ac72bb928 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -78,10 +78,13 @@ public class InlineUtil { final PsiReferenceExpression methodExpression = ((PsiMethodCallExpression)expr).getMethodExpression(); final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); if (qualifierExpression == null) { - if (((PsiMethod)resolved).getModifierList().hasModifierProperty(PsiModifier.STATIC)) { - methodExpression.setQualifierExpression(elementFactory.createReferenceExpression(thisClass)); + final PsiMethod method = (PsiMethod)resolved; + final PsiClass containingClass = method.getContainingClass(); + LOG.assertTrue(containingClass != null); + if (method.getModifierList().hasModifierProperty(PsiModifier.STATIC)) { + methodExpression.setQualifierExpression(elementFactory.createReferenceExpression(containingClass)); } else { - methodExpression.setQualifierExpression(createThisExpression(manager, thisClass, refParent)); + methodExpression.setQualifierExpression(createThisExpression(manager, containingClass, refParent)); } } } diff --git a/java/java-tests/testData/refactoring/inlineLocal/StaticImported.java b/java/java-tests/testData/refactoring/inlineLocal/StaticImported.java new file mode 100644 index 000000000000..eea23b87fda6 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/StaticImported.java @@ -0,0 +1,23 @@ +import java.util.ArrayList; +import java.util.List; + +import static Statics._emptyList; + +public class Statics { + + public static List _emptyList() { + return new ArrayList(); + } +} + + +class Foo { + public static void main(String[] args) { + List v1 = _emptyList(); + doSomething(v1); + } + + public static void doSomething(List list) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineLocal/StaticImported.java.after b/java/java-tests/testData/refactoring/inlineLocal/StaticImported.java.after new file mode 100644 index 000000000000..d40a49eb49d4 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineLocal/StaticImported.java.after @@ -0,0 +1,22 @@ +import java.util.ArrayList; +import java.util.List; + +import static Statics._emptyList; + +public class Statics { + + public static List _emptyList() { + return new ArrayList(); + } +} + + +class Foo { + public static void main(String[] args) { + doSomething(Statics._emptyList()); + } + + public static void doSomething(List list) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java index df01c1730213..962298ef0b6d 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java @@ -251,4 +251,26 @@ public class JavaFormatterAlignmentTest extends AbstractJavaFormatterTest { "}" ); } + + public void testAlignThrowsKeyword() throws Exception { + // Inspired by IDEA-63820 + + getSettings().ALIGN_THROWS_KEYWORD = true; + doClassTest( + "public void test()\n" + + " throws Exception {}", + "public void test()\n" + + "throws Exception {\n" + + "}" + ); + + getSettings().ALIGN_THROWS_KEYWORD = false; + doClassTest( + "public void test()\n" + + " throws Exception {}", + "public void test()\n" + + " throws Exception {\n" + + "}" + ); + } } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java index 8d469b31166e..9f20be7086c9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineLocalTest.java @@ -123,6 +123,10 @@ public class InlineLocalTest extends LightCodeInsightTestCase { doTest(true); } + public void testStaticImported() throws Exception { + doTest(true); + } + private void doTest(final boolean inlineDef, String conflictMessage) throws Exception { try { doTest(inlineDef); diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java index 698cd3ad5a7f..44b1baa91379 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java @@ -299,6 +299,7 @@ public class CommonCodeStyleSettings { public boolean ALIGN_MULTILINE_ASSIGNMENT = false; public boolean ALIGN_MULTILINE_TERNARY_OPERATION = false; public boolean ALIGN_MULTILINE_THROWS_LIST = false; + public boolean ALIGN_THROWS_KEYWORD = false; public boolean ALIGN_MULTILINE_EXTENDS_LIST = false; public boolean ALIGN_MULTILINE_METHOD_BRACKETS = false; diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java index eff6430a43be..038e7608b7c5 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java @@ -49,6 +49,7 @@ public class WrappingAndBracesPanel extends OptionTableWithPreviewPanel { addOption("THROWS_LIST_WRAP", WRAPPING_THROWS_LIST, WRAP_OPTIONS, WRAP_VALUES); addOption("ALIGN_MULTILINE_THROWS_LIST", ApplicationBundle.message("wrapping.align.when.multiline"), WRAPPING_THROWS_LIST); + addOption("ALIGN_THROWS_KEYWORD", ApplicationBundle.message("wrapping.align.throws.keyword"), WRAPPING_THROWS_LIST); addOption("THROWS_KEYWORD_WRAP", WRAPPING_THROWS_KEYWORD, WRAP_OPTIONS_FOR_SINGLETON, WRAP_VALUES_FOR_SINGLETON); addOption("METHOD_PARAMETERS_WRAP", WRAPPING_METHOD_PARAMETERS, WRAP_OPTIONS, WRAP_VALUES); diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ScriptingLibraryMappings.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ScriptingLibraryMappings.java index e3cdb712de0c..1563f90cb3f1 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ScriptingLibraryMappings.java +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ScriptingLibraryMappings.java @@ -47,6 +47,7 @@ public class ScriptingLibraryMappings extends LanguagePerFileMappings myCompoundLibMap = new HashMap(); private CompoundLibrary myProjectLibs = new CompoundLibrary(); + private Set myProjectLibFiles; public ScriptingLibraryMappings(final Project project, final LibraryType libraryType) { super(project); @@ -95,6 +96,7 @@ public class ScriptingLibraryMappings extends LanguagePerFileMappings mappings) { super.setMappings(mappings); updateDependencies(mappings); + updateProjectLibraryFiles(); } private static boolean dependencyExists(ModuleRootManager rootManager, Library library) { @@ -171,6 +173,7 @@ public class ScriptingLibraryMappings extends LanguagePerFileMappings(); + for (CompoundLibrary container : myCompoundLibMap.values()) { + for (ScriptingLibraryTable.LibraryModel libModel : container.getLibraries()) { + myProjectLibFiles.addAll(Arrays.asList(libModel.getSourceFiles())); + myProjectLibFiles.addAll(Arrays.asList(libModel.getCompactFiles())); + } + } + for (ScriptingLibraryTable.LibraryModel libModel : myProjectLibs.getLibraries()) { + myProjectLibFiles.addAll(Arrays.asList(libModel.getSourceFiles())); + myProjectLibFiles.addAll(Arrays.asList(libModel.getCompactFiles())); + } + } + + public Set getProjectLibraryFiles() { + if (myProjectLibFiles == null) { + updateProjectLibraryFiles(); + } + return myProjectLibFiles; + } + + } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/scripting/ScriptingLibrariesScope.java b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/scripting/ScriptingLibrariesScope.java index 75d549c0dcbc..3775379d474f 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/scripting/ScriptingLibrariesScope.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/scripting/ScriptingLibrariesScope.java @@ -30,7 +30,7 @@ public class ScriptingLibrariesScope extends GlobalSearchScope { private GlobalSearchScope myBaseScope; private ScriptingIndexableSetContributor myContributor; - private Set myLibraryFiles; + protected Set myLibraryFiles; public ScriptingLibrariesScope(GlobalSearchScope baseScope, Class providerClass) { super(baseScope.getProject()); @@ -38,21 +38,16 @@ public class ScriptingLibrariesScope extends GlobalSearchScope { IndexableSetContributor contributor = IndexableSetContributor.EP_NAME.findExtension(providerClass); if (contributor instanceof ScriptingIndexableSetContributor) { myContributor = (ScriptingIndexableSetContributor)contributor; - updateLibraryFiles(); + setLibraryFiles(); } } - public void updateLibraryFiles() { + public void setLibraryFiles() { myLibraryFiles = myContributor.getLibraryFiles(myBaseScope.getProject()); } public boolean contains(VirtualFile file) { - return myBaseScope.contains(file) | contributorContains(file); - } - - private boolean contributorContains(VirtualFile file) { - if (myContributor == null) return false; - return myLibraryFiles.contains(file); + return myBaseScope.contains(file) | (myLibraryFiles == null ? false : myLibraryFiles.contains(file)); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 13f4ed7e29b6..3887e3583e17 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -1015,7 +1015,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi charWidth = EditorUtil.charWidth(c, fontType, this); } - if (charWidth <= 0) { + if (charWidth < 0) { charWidth = spaceSize; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SelectionModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SelectionModelImpl.java index 73bf8957b66a..98de2ccac0ea 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SelectionModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SelectionModelImpl.java @@ -311,7 +311,13 @@ public class SelectionModelImpl implements SelectionModel, PrioritizedDocumentLi FoldRegion endFold = foldingModel.getCollapsedRegionAtOffset(endOffset); if (endFold != null) { - endOffset = endFold.getEndOffset(); + VisualPosition visualFoldStart = myEditor.offsetToVisualPosition(endFold.getStartOffset()); + // All visual positions that lay at collapsed fold region placeholder are mapped to the same offset. Hence, there are + // at least two distinct situations - selection end is located inside collapsed fold region placeholder and just before it. + // We want to expand selection to the fold region end at the former case and keep selection as-is at the latest one. + if (visualFoldStart.column < endPosition.column) { + endOffset = endFold.getEndOffset(); + } } int oldSelectionStart; @@ -583,6 +589,20 @@ public class SelectionModelImpl implements SelectionModel, PrioritizedDocumentLi if (marker != null) { int startOffset = marker.getStartOffset(); int endOffset = marker.getEndOffset(); + if (caretOffset != startOffset && caretOffset != endOffset) { + // Try to check if current selection is tweaked by fold region. + FoldingModelEx foldingModel = myEditor.getFoldingModel(); + FoldRegion foldRegion = foldingModel.getCollapsedRegionAtOffset(caretOffset); + if (foldRegion != null) { + if (foldRegion.getStartOffset() == startOffset) { + return endOffset; + } + else if (foldRegion.getEndOffset() == endOffset) { + return startOffset; + } + } + } + if (caretOffset == endOffset) { return startOffset; } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index eeca36cec25f..fcdb403e126b 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -180,6 +180,7 @@ wrapping.extends.implements.list=Extends/implements list wrapping.extends.implements.keyword=Extends/implements keyword wrapping.throws.list=Throws list wrapping.throws.keyword=Throws keyword +wrapping.align.throws.keyword=Align 'throws' to method start wrapping.ternary.operation=Ternary operation wrapping.assignment.variables.groups=Fields/variables groups wrapping.assignment.statement=Assignment statement diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java index 96a251590ffd..e8c77a325055 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java @@ -24,6 +24,7 @@ import com.intellij.lang.documentation.CodeDocumentationProvider; import com.intellij.lang.documentation.ExternalDocumentationProvider; import com.intellij.lang.java.JavaDocumentationProvider; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.javadoc.PsiDocParamRef; import com.intellij.psi.javadoc.PsiDocComment; @@ -162,7 +163,8 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E if (originalElement instanceof GrReferenceExpression) { final PsiType inferredType = ((GrReferenceExpression)originalElement).getType(); if (inferredType != null) { - buffer.append("[inferred type] ").append(inferredType.getCanonicalText()); + buffer.append("[inferred type] "); + appendTypeString(buffer, inferredType); return; } } @@ -256,7 +258,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E private static void appendTypeString(StringBuffer buffer, PsiType type) { if (type != null) { - buffer.append(type.getCanonicalText()); + buffer.append(StringUtil.escapeXml(type.getCanonicalText())); } else { buffer.append(GrModifier.DEF); diff --git a/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java b/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java index 6a8a4ec0d21d..c43886ecc2eb 100644 --- a/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java +++ b/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java @@ -33,8 +33,7 @@ import com.intellij.xml.util.XmlTagUtil; /** * @author ven */ -public class XMLExternalAnnotator implements ExternalAnnotator, Validator.ValidationHost { - private AnnotationHolder myHolder; +public class XMLExternalAnnotator implements ExternalAnnotator { public void annotate(PsiFile file, AnnotationHolder holder) { if (!(file instanceof XmlFile)) return; @@ -44,64 +43,68 @@ public class XMLExternalAnnotator implements ExternalAnnotator, Validator.Valida XmlNSDescriptor nsDescriptor = rootTag == null ? null : rootTag.getNSDescriptor(rootTag.getNamespace(), false); if (nsDescriptor instanceof Validator && !HtmlUtil.isHtml5Document(document)) { - myHolder = holder; - try { //noinspection unchecked - ((Validator)nsDescriptor).validate(document, this); - } - finally { - myHolder = null; - } + ((Validator)nsDescriptor).validate(document, new MyHost(holder)); } } - private static final ErrorType[] types = ErrorType.values(); - - public void addMessage(PsiElement context, String message, int type) { - addMessage(context, message, types[type]); - } - - public void addMessage(final PsiElement context, final String message, final ErrorType type, final IntentionAction... fixes) { - if (message != null && message.length() > 0) { - if (context instanceof XmlTag) { - addMessagesForTag((XmlTag)context, message, type, fixes); - } - else { - if (type == Validator.ValidationHost.ErrorType.ERROR) { - appendFixes(myHolder.createErrorAnnotation(context, message), fixes); - } else { - appendFixes(myHolder.createWarningAnnotation(context, message), fixes); - } - } - } - } - - private void addMessagesForTag(XmlTag tag, String message, ErrorType type, IntentionAction... actions) { - XmlToken childByRole = XmlTagUtil.getStartTagNameElement(tag); - - addMessagesForTreeChild(childByRole, type, message, actions); - - childByRole = XmlTagUtil.getEndTagNameElement(tag); - addMessagesForTreeChild(childByRole, type, message, actions); - } - - private void addMessagesForTreeChild(final XmlToken childByRole, final ErrorType type, final String message, IntentionAction... actions) { - if (childByRole != null) { - Annotation annotation; - if (type == ErrorType.ERROR) { - annotation = myHolder.createErrorAnnotation(childByRole, message); - } - else { - annotation = myHolder.createWarningAnnotation(childByRole, message); - } - - appendFixes(annotation, actions); - } - } + private static final Validator.ValidationHost.ErrorType[] types = Validator.ValidationHost.ErrorType.values(); private static void appendFixes(final Annotation annotation, final IntentionAction... actions) { if (actions != null) { for(IntentionAction action:actions) annotation.registerFix(action); } } + + private static class MyHost implements Validator.ValidationHost { + + private final AnnotationHolder myHolder; + + public MyHost(AnnotationHolder holder) { + + myHolder = holder; + } + + public void addMessage(PsiElement context, String message, int type) { + addMessage(context, message, types[type]); + } + + public void addMessage(final PsiElement context, final String message, final ErrorType type, final IntentionAction... fixes) { + if (message != null && message.length() > 0) { + if (context instanceof XmlTag) { + addMessagesForTag((XmlTag)context, message, type, fixes); + } + else { + if (type == Validator.ValidationHost.ErrorType.ERROR) { + appendFixes(myHolder.createErrorAnnotation(context, message), fixes); + } else { + appendFixes(myHolder.createWarningAnnotation(context, message), fixes); + } + } + } + } + + private void addMessagesForTag(XmlTag tag, String message, ErrorType type, IntentionAction... actions) { + XmlToken childByRole = XmlTagUtil.getStartTagNameElement(tag); + + addMessagesForTreeChild(childByRole, type, message, actions); + + childByRole = XmlTagUtil.getEndTagNameElement(tag); + addMessagesForTreeChild(childByRole, type, message, actions); + } + + private void addMessagesForTreeChild(final XmlToken childByRole, final ErrorType type, final String message, IntentionAction... actions) { + if (childByRole != null) { + Annotation annotation; + if (type == ErrorType.ERROR) { + annotation = myHolder.createErrorAnnotation(childByRole, message); + } + else { + annotation = myHolder.createWarningAnnotation(childByRole, message); + } + + appendFixes(annotation, actions); + } + } + } } diff --git a/xml/impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java b/xml/impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java index 2c03f0e80dcb..73aa583f7b2c 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java +++ b/xml/impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java @@ -22,6 +22,8 @@ import com.intellij.psi.ResolveState; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceUtil; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.util.CachedValue; +import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.xml.*; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.util.HtmlUtil; @@ -35,7 +37,7 @@ import java.util.List; * @author Maxim.Mossienko */ public class ScriptSupportUtil { - private static final Key CachedScriptTagsKey = Key.create("script tags"); + private static final Key> CachedScriptTagsKey = Key.create("script tags"); private static final ThreadLocal ProcessingDeclarationsFlag = new ThreadLocal(); private static final @NonNls String SCRIPT_TAG = "script"; @@ -46,61 +48,71 @@ public class ScriptSupportUtil { element.putUserData(CachedScriptTagsKey,null); } - public static boolean processDeclarations(XmlFile element, PsiScopeProcessor processor, ResolveState state, PsiElement lastParent, PsiElement place) { - XmlTag[] myCachedScriptTags = element.getUserData(CachedScriptTagsKey); - + public static boolean processDeclarations(final XmlFile element, + PsiScopeProcessor processor, + ResolveState state, + PsiElement lastParent, + PsiElement place) { + CachedValue myCachedScriptTags = element.getUserData(CachedScriptTagsKey); if (myCachedScriptTags == null) { - final List scriptTags = new ArrayList(); - final XmlDocument document = HtmlUtil.getRealXmlDocument(element.getDocument()); + myCachedScriptTags = element.getManager().getCachedValuesManager().createCachedValue(new CachedValueProvider() { + @Override + public Result compute() { + final List scriptTags = new ArrayList(); + final XmlDocument document = HtmlUtil.getRealXmlDocument(element.getDocument()); - if (document != null) { - XmlUtil.processXmlElements(document, - new PsiElementProcessor() { - public boolean execute(final PsiElement element) { - if (element instanceof XmlTag) { - final XmlTag tag = (XmlTag)element; + if (document != null) { + PsiElementProcessor psiElementProcessor = new PsiElementProcessor() { + public boolean execute(final PsiElement element) { + if (element instanceof XmlTag) { + final XmlTag tag = (XmlTag)element; - if (SCRIPT_TAG.equalsIgnoreCase(tag.getName())) { - final XmlElementDescriptor descriptor = tag.getDescriptor(); - if (descriptor != null && SCRIPT_TAG.equals(descriptor.getName())) { - scriptTags.add(tag); + if (SCRIPT_TAG.equalsIgnoreCase(tag.getName())) { + final XmlElementDescriptor descriptor = tag.getDescriptor(); + if (descriptor != null && SCRIPT_TAG.equals(descriptor.getName())) { + scriptTags.add(tag); + } + } } + return true; } - } - return true; + }; + XmlUtil.processXmlElements(document,psiElementProcessor, true); } - }, true); - } - myCachedScriptTags = scriptTags.toArray(new XmlTag[scriptTags.size()]); + return new Result(scriptTags.toArray(new XmlTag[scriptTags.size()]), element); + } + }, false); element.putUserData(CachedScriptTagsKey, myCachedScriptTags); } if (ProcessingDeclarationsFlag.get() != null) return true; - + try { ProcessingDeclarationsFlag.set(""); - for (XmlTag tag : myCachedScriptTags) { + for (XmlTag tag : myCachedScriptTags.getValue()) { final XmlTagChild[] children = tag.getValue().getChildren(); for (XmlTagChild child : children) { if (!child.processDeclarations(processor, state, null, place)) return false; } - if(tag.getAttributeValue("src") != null) { + if (tag.getAttributeValue("src") != null) { final XmlAttribute attribute = tag.getAttribute("src", null); if (attribute != null) { final PsiFile psiFile = FileReferenceUtil.findFile(attribute.getValueElement()); if (psiFile != null && psiFile.isValid()) { - if(!psiFile.processDeclarations(processor, state, null, place)) + if (!psiFile.processDeclarations(processor, state, null, place)) { return false; + } } } } } - } finally { + } + finally { ProcessingDeclarationsFlag.set(null); }