X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java index 09d6734..9bf5601 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCodeScanner.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.List; import net.sourceforge.phpdt.internal.ui.text.AbstractJavaScanner; +import net.sourceforge.phpdt.internal.ui.text.CombinedWordRule; import net.sourceforge.phpdt.ui.text.IColorManager; import net.sourceforge.phpeclipse.IPreferenceConstants; import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr; @@ -24,6 +25,7 @@ import net.sourceforge.phpeclipse.phpeditor.util.PHPWordDetector; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.rules.EndOfLineRule; import org.eclipse.jface.text.rules.ICharacterScanner; +import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.IWordDetector; import org.eclipse.jface.text.rules.MultiLineRule; @@ -35,7 +37,80 @@ import org.eclipse.jface.text.rules.WordRule; * PHP Code Scanner */ public class PHPCodeScanner extends AbstractJavaScanner { - + + /** + * Rule to detect java operators. + * + * @since 3.0 + */ + protected class OperatorRule implements IRule { + + /** Java operators */ + private final char[] JAVA_OPERATORS= { ';', '(', ')', '{', '}', '.', '=', '/', '\\', '+', '-', '*', '[', ']', '<', '>', ':', '?', '!', ',', '|', '&', '^', '%', '~', '@'}; + /** Token to return for this rule */ + private final IToken fToken; + + /** + * Creates a new operator rule. + * + * @param token + * Token to use for this rule + */ + public OperatorRule(IToken token) { + fToken= token; + } + + /** + * Is this character an operator character? + * + * @param character + * Character to determine whether it is an operator character + * @return true iff the character is an operator, + * false otherwise. + */ + public boolean isOperator(char character) { + for (int index= 0; index < JAVA_OPERATORS.length; index++) { + if (JAVA_OPERATORS[index] == character) + return true; + } + return false; + } + + /* + * @see org.eclipse.jface.text.rules.IRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner) + */ + public IToken evaluate(ICharacterScanner scanner) { + + int character= scanner.read(); + if (isOperator((char) character)) { + int lastCharacter = character; + character= scanner.read(); + if (!isOperator((char) character)) { + scanner.unread(); + return fToken; + } + if (lastCharacter=='<' && character=='?') { + scanner.unread(); + scanner.unread(); + return Token.UNDEFINED; + } + if (lastCharacter=='?' && character=='>') { + scanner.unread(); + scanner.unread(); + return Token.UNDEFINED; + } + do { + character= scanner.read(); + } while (isOperator((char) character)); + scanner.unread(); + return fToken; + } else { + scanner.unread(); + return Token.UNDEFINED; + } + } + } + private class PHPWordRule extends WordRule { private StringBuffer fBuffer = new StringBuffer(); @@ -54,32 +129,41 @@ public class PHPCodeScanner extends AbstractJavaScanner { c = scanner.read(); if (c != '?') { scanner.unread(); + scanner.unread(); + return Token.UNDEFINED; } else { c = scanner.read(); if (c != 'p') { scanner.unread(); + return getToken(IPreferenceConstants.PHP_TAG); } else { c = scanner.read(); if (c != 'h') { scanner.unread(); + scanner.unread(); + return getToken(IPreferenceConstants.PHP_TAG); } else { c = scanner.read(); if (c != 'p') { scanner.unread(); + scanner.unread(); + scanner.unread(); + return getToken(IPreferenceConstants.PHP_TAG); } else { return getToken(IPreferenceConstants.PHP_TAG); } } } } - } if (c == '?') { - c = scanner.read(); + c = scanner.read(); if (c == '>') { return getToken(IPreferenceConstants.PHP_TAG); - } + } scanner.unread(); + scanner.unread(); + return Token.UNDEFINED; } if (fDetector.isWordStart((char) c)) { if (c == '$') { @@ -119,23 +203,28 @@ public class PHPCodeScanner extends AbstractJavaScanner { { IPreferenceConstants.PHP_MULTILINE_COMMENT, IPreferenceConstants.PHP_SINGLELINE_COMMENT, - IPreferenceConstants.PHP_TAG, + IPreferenceConstants.PHP_TAG, IPreferenceConstants.PHP_KEYWORD, IPreferenceConstants.PHP_FUNCTIONNAME, IPreferenceConstants.PHP_VARIABLE, IPreferenceConstants.PHP_STRING, IPreferenceConstants.PHP_TYPE, IPreferenceConstants.PHP_CONSTANT, - IPreferenceConstants.PHP_DEFAULT }; + IPreferenceConstants.PHP_DEFAULT, + IPreferenceConstants.PHP_OPERATOR, + IPreferenceConstants.PHP_KEYWORD_RETURN}; /** - * Creates a PHP code scanner - */ + * Creates a PHP code scanner + */ // public PHPCodeScanner(JavaColorManager provider, IPreferenceStore store) { public PHPCodeScanner(IColorManager manager, IPreferenceStore store) { super(manager, store); initialize(); - // // final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); - // Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND)); + // // final IPreferenceStore store = + // PHPeclipsePlugin.getDefault().getPreferenceStore(); + // Color BackgroundColor = + // provider.getColor(PreferenceConverter.getColor(store, + // PHP_EDITOR_BACKGROUND)); // variable = // new Token( // new TextAttribute( @@ -148,13 +237,15 @@ public class PHPCodeScanner extends AbstractJavaScanner { // provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD)), // BackgroundColor, // //SWT.NONE)); - // (store.getBoolean(PHP_KEYWORD_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_KEYWORD_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // (store.getBoolean(PHP_KEYWORD_BOLD) ? SWT.BOLD : SWT.NONE) + + // (store.getBoolean(PHP_KEYWORD_ITALIC) ? SWT.ITALIC : SWT.NONE))); // type = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_TYPE)), // BackgroundColor, // //SWT.NONE)); - // (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + + // (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE))); // functionName = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME)), @@ -167,40 +258,56 @@ public class PHPCodeScanner extends AbstractJavaScanner { // provider.getColor(PreferenceConverter.getColor(store, PHP_CONSTANT)), // BackgroundColor, // //SWT.NONE)); - // (store.getBoolean(PHP_CONSTANT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_CONSTANT_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // (store.getBoolean(PHP_CONSTANT_BOLD) ? SWT.BOLD : SWT.NONE) + + // (store.getBoolean(PHP_CONSTANT_ITALIC) ? SWT.ITALIC : SWT.NONE))); // string = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_STRING)), // BackgroundColor, // //SWT.NONE)); - // (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE ) + (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE ) + + // (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE))); // comment = // new Token(new TextAttribute( - // provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT)), + // provider.getColor(PreferenceConverter.getColor(store, + // PHP_SINGLELINE_COMMENT)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_SINGLELINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE ) - // + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : + // SWT.NONE))); // multi_comment = // new Token(new TextAttribute( - // provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT)), + // provider.getColor(PreferenceConverter.getColor(store, + // PHP_MULTILINE_COMMENT)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_MULTILINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE) - // + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : + // SWT.NONE))); // other = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT)), // BackgroundColor, // //SWT.NONE)); - // (store.getBoolean(PHP_DEFAULT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_DEFAULT_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // (store.getBoolean(PHP_DEFAULT_BOLD) ? SWT.BOLD : SWT.NONE) + + // (store.getBoolean(PHP_DEFAULT_ITALIC) ? SWT.ITALIC : SWT.NONE))); // updateWordRules(); } + /* + * @see AbstractJavaScanner#getTokenProperties() + */ + protected String[] getTokenProperties() { + return fgTokenProperties; + } // public void updateToken(JavaColorManager provider) { - // final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); + // final IPreferenceStore store = + // PHPeclipsePlugin.getDefault().getPreferenceStore(); // - // Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND)); + // Color BackgroundColor = + // provider.getColor(PreferenceConverter.getColor(store, + // PHP_EDITOR_BACKGROUND)); // // variable.setData( // new TextAttribute( @@ -218,7 +325,8 @@ public class PHPCodeScanner extends AbstractJavaScanner { // new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_TYPE)), // BackgroundColor, - // (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + + // (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE))); // functionName.setData( // new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME)), @@ -235,19 +343,24 @@ public class PHPCodeScanner extends AbstractJavaScanner { // new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_STRING)), // BackgroundColor, - // (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE) + + // (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE))); // comment.setData( // new TextAttribute( - // provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT)), + // provider.getColor(PreferenceConverter.getColor(store, + // PHP_SINGLELINE_COMMENT)), // BackgroundColor, // (store.getBoolean(PHP_SINGLELINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE) - // + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : + // SWT.NONE))); // multi_comment.setData( // new TextAttribute( - // provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT)), + // provider.getColor(PreferenceConverter.getColor(store, + // PHP_MULTILINE_COMMENT)), // BackgroundColor, // (store.getBoolean(PHP_MULTILINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE) - // + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); + // + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : + // SWT.NONE))); // other.setData( // new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT)), @@ -258,12 +371,7 @@ public class PHPCodeScanner extends AbstractJavaScanner { // public void updateWordRules() { - /* - * @see AbstractJavaScanner#getTokenProperties() - */ - protected String[] getTokenProperties() { - return fgTokenProperties; - } + /* * @see AbstractJavaScanner#createRules() */ @@ -278,10 +386,7 @@ public class PHPCodeScanner extends AbstractJavaScanner { rules.add(new MultiLineRule("\"", "\"", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ rules.add(new MultiLineRule("`", "`", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ rules.add(new MultiLineRule("'", "'", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ - - //previous version - //rules.add(new SingleLineRule("'", "'", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ - + token = getToken(IPreferenceConstants.PHP_MULTILINE_COMMENT); rules.add(new MultiLineRule("/*", "*/", token)); //$NON-NLS-2$ //$NON-NLS-1$ // Add generic whitespace rule. @@ -289,33 +394,46 @@ public class PHPCodeScanner extends AbstractJavaScanner { // Add word rule for keywords, types, and constants. token = getToken(IPreferenceConstants.PHP_DEFAULT); PHPWordRule wordRule = new PHPWordRule(new PHPWordDetector(), token); - + Token keyword = getToken(IPreferenceConstants.PHP_KEYWORD); Token functionName = getToken(IPreferenceConstants.PHP_FUNCTIONNAME); Token type = getToken(IPreferenceConstants.PHP_TYPE); Token constant = getToken(IPreferenceConstants.PHP_CONSTANT); ArrayList buffer = PHPSyntaxRdr.getSyntaxData(); - // String strbuffer = null; unused + // String strbuffer = null; unused PHPElement elbuffer = null; + String name; for (int i = 0; i < buffer.size(); i++) { // while ((buffer != null) // && (!buffer.isEmpty() // && ((elbuffer = (PHPElement) buffer.remove(0)) != null))) { elbuffer = (PHPElement) buffer.get(i); - if (elbuffer instanceof PHPKeyword) - wordRule.addWord(((PHPKeyword) elbuffer).getName(), keyword); - if (elbuffer instanceof PHPFunction) + if (elbuffer instanceof PHPKeyword) { + name = ((PHPKeyword) elbuffer).getName(); + if (!name.equals("return")) { + wordRule.addWord(name, keyword); + } + } else if (elbuffer instanceof PHPFunction) { wordRule.addWord(((PHPFunction) elbuffer).getName(), functionName); - if (elbuffer instanceof PHPType) + } else if (elbuffer instanceof PHPType) { wordRule.addWord(elbuffer.getName(), type); - if (elbuffer instanceof PHPConstant) + } else if (elbuffer instanceof PHPConstant) { wordRule.addWord(elbuffer.getName(), constant); + } } + +// Add word rule for keyword 'return'. + token= getToken(IPreferenceConstants.PHP_KEYWORD_RETURN); + wordRule.addWord("return", token); + +// Add rule for operators and brackets (at the end !) + token= getToken(IPreferenceConstants.PHP_OPERATOR); + rules.add(new OperatorRule(token)); + rules.add(wordRule); - // IRule[] result = new IRule[rules.size()];unused - // rules.toArray(result); - // setRules(result); + + setDefaultReturnToken(getToken(IPreferenceConstants.PHP_DEFAULT)); return rules; } }