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;
}