diff --git a/openapi/src/com/intellij/lang/BracePair.java b/openapi/src/com/intellij/lang/BracePair.java new file mode 100644 index 000000000000..9cbefec212d4 --- /dev/null +++ b/openapi/src/com/intellij/lang/BracePair.java @@ -0,0 +1,34 @@ +package com.intellij.lang; + +import com.intellij.psi.tree.IElementType; + +/** + * Created by IntelliJ IDEA. + * User: max + * Date: Feb 2, 2005 + * Time: 11:58:23 AM + * To change this template use File | Settings | File Templates. + */ +public class BracePair { + private IElementType myLeftBrace; + private IElementType myRightBrace; + private boolean myStructural; + + public BracePair(final IElementType leftBrace, final IElementType rightBrace, final boolean structural) { + myLeftBrace = leftBrace; + myRightBrace = rightBrace; + myStructural = structural; + } + + public IElementType getLeftBraceType() { + return myLeftBrace; + } + + public IElementType getRightBraceType() { + return myRightBrace; + } + + public boolean isStructural() { + return myStructural; + } +} diff --git a/openapi/src/com/intellij/lang/Language.java b/openapi/src/com/intellij/lang/Language.java index 1bcb8fe22066..744d195ef774 100644 --- a/openapi/src/com/intellij/lang/Language.java +++ b/openapi/src/com/intellij/lang/Language.java @@ -62,6 +62,10 @@ public abstract class Language { return null; } + public PairedBraceMatcher getPairedBraceMatcher() { + return null; + } + public String toString() { return "Language: " + myID; } diff --git a/openapi/src/com/intellij/lang/PairedBraceMatcher.java b/openapi/src/com/intellij/lang/PairedBraceMatcher.java new file mode 100644 index 000000000000..6a0d6e366a27 --- /dev/null +++ b/openapi/src/com/intellij/lang/PairedBraceMatcher.java @@ -0,0 +1,12 @@ +package com.intellij.lang; + +/** + * Created by IntelliJ IDEA. + * User: max + * Date: Feb 2, 2005 + * Time: 11:57:50 AM + * To change this template use File | Settings | File Templates. + */ +public interface PairedBraceMatcher { + BracePair[] getPairs(); +} diff --git a/resources/src/componentSets/Core.xml b/resources/src/componentSets/Core.xml index dae8595400ba..47e7b1a73312 100644 --- a/resources/src/componentSets/Core.xml +++ b/resources/src/componentSets/Core.xml @@ -108,6 +108,10 @@ com.intellij.psi.codeStyle.CodeStyleSchemes com.intellij.psi.impl.source.codeStyle.CodeStyleSchemesImpl + + com.intellij.codeFormatting.PseudoTextElementFactory + com.intellij.codeFormatting.general.PseudoTextElementFactoryImpl + com.intellij.application.options.PathMacros com.intellij.application.options.PathMacros diff --git a/source/com/intellij/codeFormatting/general/FormatterUtil.java b/source/com/intellij/codeFormatting/general/FormatterUtil.java index ca37ea4eafc2..0f0dd64f4d0c 100644 --- a/source/com/intellij/codeFormatting/general/FormatterUtil.java +++ b/source/com/intellij/codeFormatting/general/FormatterUtil.java @@ -31,12 +31,13 @@ */ package com.intellij.codeFormatting.general; +import com.intellij.lang.ASTNode; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.psi.impl.source.codeStyle.Helper; import com.intellij.psi.impl.source.parsing.ChameleonTransforming; import com.intellij.psi.impl.source.tree.*; -import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.IElementType; public class FormatterUtil { @@ -105,8 +106,8 @@ public class FormatterUtil { return text.length() > 0 && text.trim().length() == 0; } - public static String replaceWhiteSpace(final String whiteSpace, final ASTNode leafElement) { - LeafElement whiteSpaceElement = Factory.createSingleLeafElement(ElementType.WHITE_SPACE, + public static String replaceWhiteSpace(final String whiteSpace, final ASTNode leafElement, final IElementType whiteSpaceToken) { + LeafElement whiteSpaceElement = Factory.createSingleLeafElement(whiteSpaceToken, whiteSpace.toCharArray(), 0, whiteSpace.length(), SharedImplUtil.findCharTableByTree(leafElement), null); diff --git a/source/com/intellij/codeInsight/actions/ReformatCodeAction.java b/source/com/intellij/codeInsight/actions/ReformatCodeAction.java index 0abf11e28c0a..e93db9d65c1a 100644 --- a/source/com/intellij/codeInsight/actions/ReformatCodeAction.java +++ b/source/com/intellij/codeInsight/actions/ReformatCodeAction.java @@ -1,5 +1,7 @@ package com.intellij.codeInsight.actions; +import com.intellij.codeFormatting.PseudoTextBuilder; +import com.intellij.lang.Language; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.DataConstantsEx; import com.intellij.openapi.editor.Editor; @@ -118,10 +120,19 @@ public class ReformatCodeAction extends AnAction { Editor editor = (Editor)dataContext.getData(DataConstants.EDITOR); if (editor != null){ PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); - if (file == null || (!(file instanceof PsiJavaFile) && !(file instanceof XmlFile))){ + if (file == null) { presentation.setEnabled(false); return; } + + final Language lang = file.getLanguage(); + if (lang != null) { + final PseudoTextBuilder formatter = lang.getFormatter(); + if (formatter == null) { + presentation.setEnabled(false); + return; + } + } } else if (dataContext.getData(DataConstantsEx.MODULE_CONTEXT) == null && dataContext.getData(DataConstantsEx.PROJECT_CONTEXT) == null) { diff --git a/source/com/intellij/codeInsight/highlighting/BraceMatchingUtil.java b/source/com/intellij/codeInsight/highlighting/BraceMatchingUtil.java index d22051576487..34af9cc8fd18 100644 --- a/source/com/intellij/codeInsight/highlighting/BraceMatchingUtil.java +++ b/source/com/intellij/codeInsight/highlighting/BraceMatchingUtil.java @@ -1,8 +1,11 @@ package com.intellij.codeInsight.highlighting; +import com.intellij.lang.BracePair; +import com.intellij.lang.PairedBraceMatcher; import com.intellij.openapi.editor.ex.HighlighterIterator; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.util.Comparing; import com.intellij.psi.JavaDocTokenType; @@ -39,6 +42,62 @@ public class BraceMatchingUtil { IElementType getTokenType(char ch, HighlighterIterator iterator); } + private static class PairedBraceMatcherAdapter implements BraceMatcher { + private PairedBraceMatcher myMatcher; + + public PairedBraceMatcherAdapter(final PairedBraceMatcher matcher) { + myMatcher = matcher; + } + + public int getTokenGroup(IElementType tokenType) { + return 0; + } + + public boolean isLBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) { + final IElementType tokenType = iterator.getTokenType(); + final BracePair[] pairs = myMatcher.getPairs(); + for (int i = 0; i < pairs.length; i++) { + BracePair pair = pairs[i]; + if (tokenType == pair.getLeftBraceType()) return true; + } + return false; + } + + public boolean isRBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) { + final IElementType tokenType = iterator.getTokenType(); + final BracePair[] pairs = myMatcher.getPairs(); + for (int i = 0; i < pairs.length; i++) { + BracePair pair = pairs[i]; + if (tokenType == pair.getRightBraceType()) return true; + } + return false; + } + + public boolean isPairBraces(IElementType tokenType, IElementType tokenType2) { + final BracePair[] pairs = myMatcher.getPairs(); + for (int i = 0; i < pairs.length; i++) { + BracePair pair = pairs[i]; + if (tokenType == pair.getLeftBraceType() && tokenType2 == pair.getRightBraceType() || + tokenType == pair.getRightBraceType() && tokenType2 == pair.getLeftBraceType()) return true; + } + return false; + } + + public boolean isStructuralBrace(HighlighterIterator iterator, CharSequence text, FileType fileType) { + final IElementType tokenType = iterator.getTokenType(); + final BracePair[] pairs = myMatcher.getPairs(); + for (int i = 0; i < pairs.length; i++) { + BracePair pair = pairs[i]; + if (tokenType == pair.getRightBraceType() || tokenType == pair.getLeftBraceType()) return pair.isStructural(); + } + return false; + } + + public IElementType getTokenType(char ch, HighlighterIterator iterator) { + return null; + } + } + private static class DefaultBraceMatcher implements BraceMatcher { private static final BidirectionalMap PAIRING_TOKENS = new BidirectionalMap(); static { @@ -410,7 +469,7 @@ public class BraceMatchingUtil { } public static boolean isStructuralBraceToken(FileType fileType, HighlighterIterator iterator,CharSequence text) { - BraceMatcher matcher = BRACE_MATCHERS.get(fileType); + BraceMatcher matcher = getBraceMatcher(fileType); if (matcher!=null) return matcher.isStructuralBrace(iterator, text, fileType); return false; } @@ -422,27 +481,27 @@ public class BraceMatchingUtil { } public static boolean isLBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType){ - final BraceMatcher braceMatcher = BRACE_MATCHERS.get(fileType); + final BraceMatcher braceMatcher = getBraceMatcher(fileType); if (braceMatcher!=null) return braceMatcher.isLBraceToken(iterator, fileText, fileType); return false; } public static boolean isRBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType){ - final BraceMatcher braceMatcher = BRACE_MATCHERS.get(fileType); + final BraceMatcher braceMatcher = getBraceMatcher(fileType); if (braceMatcher!=null) return braceMatcher.isRBraceToken(iterator, fileText, fileType); return false; } public static boolean isPairBraces(IElementType tokenType1, IElementType tokenType2, FileType fileType){ - BraceMatcher matcher = BRACE_MATCHERS.get(fileType); + BraceMatcher matcher = getBraceMatcher(fileType); if (matcher!=null) return matcher.isPairBraces(tokenType1, tokenType2); return false; } private static int getTokenGroup(IElementType tokenType, FileType fileType){ - BraceMatcher matcher = BRACE_MATCHERS.get(fileType); + BraceMatcher matcher = getBraceMatcher(fileType); if (matcher!=null) return matcher.getTokenGroup(tokenType); return -1; } @@ -641,7 +700,16 @@ public class BraceMatchingUtil { public static BraceMatcher getBraceMatcher(FileType fileType) { BraceMatcher braceMatcher = BRACE_MATCHERS.get(fileType); - if (braceMatcher==null) braceMatcher = BRACE_MATCHERS.get(StdFileTypes.JAVA); + if (braceMatcher==null) { + if (fileType instanceof LanguageFileType) { + final PairedBraceMatcher matcher = ((LanguageFileType)fileType).getLanguage().getPairedBraceMatcher(); + if (matcher != null) { + braceMatcher = new PairedBraceMatcherAdapter(matcher); + } + } + if (braceMatcher == null) braceMatcher = getBraceMatcher(StdFileTypes.JAVA); + BRACE_MATCHERS.put(fileType, braceMatcher); + } return braceMatcher; } } diff --git a/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java b/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java index b5fd1994fc62..f59436f44abf 100644 --- a/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java +++ b/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java @@ -5,9 +5,9 @@ import com.intellij.codeFormatting.PseudoTextBuilder; import com.intellij.lang.ASTNode; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ex.ApplicationEx; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -22,6 +22,8 @@ import com.intellij.psi.impl.source.tree.CompositeElement; * */ public class CodeFormatterFacade implements Constants { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.codeStyle.CodeFormatterFacade"); + private CodeStyleSettings mySettings; private Helper myHelper; private IndentAdjusterFacade myIndentAdjuster; @@ -122,7 +124,7 @@ public class CodeFormatterFacade implements Constants { GeneralCodeFormatter.createSimpleInstance(pseudoText, mySettings, fileType, startOffset, endOffset).format(); } catch (Exception e) { - + LOG.error(e); } //System.out.println("Time to reformat: " + (System.currentTimeMillis() - start)); formatComments(element, startOffset, endOffset); @@ -136,10 +138,7 @@ public class CodeFormatterFacade implements Constants { } private boolean useNewFormatter(FileType fileType) { - return (fileType == StdFileTypes.JAVA - || fileType == StdFileTypes.XML - || fileType == StdFileTypes.JSPX - || fileType == StdFileTypes.HTML); + return true; } private ASTNode processRange(ASTNode element, int[] bounds) { diff --git a/util/src/com/intellij/util/containers/Enumerator.java b/util/src/com/intellij/util/containers/Enumerator.java index 2736414cd515..ed7d2c38e020 100644 --- a/util/src/com/intellij/util/containers/Enumerator.java +++ b/util/src/com/intellij/util/containers/Enumerator.java @@ -63,7 +63,7 @@ public class Enumerator { final int res = myNumbers.get(object); if (res == 0) - LOG.error( "Object must be already added to enumerator!" ); + LOG.error( "Object "+ object + " must be already added to enumerator!" ); return res; }