First drop of JavaScript formatter implementation.

This commit is contained in:
Maxim Shafirov
2005-02-03 00:49:54 +03:00
parent 7a58686703
commit 65bf522606
9 changed files with 150 additions and 17 deletions
@@ -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;
}
}
@@ -62,6 +62,10 @@ public abstract class Language {
return null;
}
public PairedBraceMatcher getPairedBraceMatcher() {
return null;
}
public String toString() {
return "Language: " + myID;
}
@@ -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();
}
+4
View File
@@ -108,6 +108,10 @@
<interface-class>com.intellij.psi.codeStyle.CodeStyleSchemes</interface-class>
<implementation-class>com.intellij.psi.impl.source.codeStyle.CodeStyleSchemesImpl</implementation-class>
</component>
<component>
<interface-class>com.intellij.codeFormatting.PseudoTextElementFactory</interface-class>
<implementation-class>com.intellij.codeFormatting.general.PseudoTextElementFactoryImpl</implementation-class>
</component>
<component>
<interface-class>com.intellij.application.options.PathMacros</interface-class>
<implementation-class>com.intellij.application.options.PathMacros</implementation-class>
@@ -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);
@@ -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) {
@@ -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<IElementType, IElementType> PAIRING_TOKENS = new BidirectionalMap<IElementType, IElementType>();
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;
}
}
@@ -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) {
@@ -63,7 +63,7 @@ public class Enumerator<T> {
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;
}