X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java index b96202a..00ec730 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java @@ -31,10 +31,95 @@ import org.eclipse.jface.text.rules.WordRule; */ public class PHPPartitionScanner extends RuleBasedPartitionScanner { - private final static String SKIP= "__skip"; //$NON-NLS-1$ - public final static String JAVA_MULTILINE_COMMENT= "__html_multiline_comment"; //$NON-NLS-1$ -// public final static String JAVA_DOC= "__java_javadoc"; //$NON-NLS-1$ - public final static String PHP= "__php"; + private final static String SKIP = "__skip"; //$NON-NLS-1$ + public final static String JAVA_MULTILINE_COMMENT = "__html_multiline_comment"; //$NON-NLS-1$ + // public final static String JAVA_DOC= "__java_javadoc"; //$NON-NLS-1$ + public final static String PHP = "__php"; + + public class PHPMultiLineRule extends MultiLineRule { + + public PHPMultiLineRule(String startSequence, String endSequence, IToken token) { + super(startSequence, endSequence, token); + } + + public PHPMultiLineRule(String startSequence, String endSequence, IToken token, char escapeCharacter) { + super(startSequence, endSequence, token, escapeCharacter); + } + + protected boolean endSequenceDetected(ICharacterScanner scanner) { + int c; + int c2; + + boolean lineCommentMode = false; + boolean multiLineCommentMode = false; + boolean stringMode = false; + + char[][] delimiters = scanner.getLegalLineDelimiters(); + while ((c = scanner.read()) != ICharacterScanner.EOF) { + if (c == '\n') { + lineCommentMode = false; + // read until end of line + } else if (c == '#') { + // read until end of line + lineCommentMode = true; + continue; + } else if (c == '/') { + c2 = scanner.read(); + if (c2 == '/') { + lineCommentMode = true; + continue; + } else if(c2 == '*') { + multiLineCommentMode = true; + continue; + } else { + scanner.unread(); + } + } else if (c == '*' && multiLineCommentMode) { + c2 = scanner.read(); + if (c2 == '/') { + multiLineCommentMode = false; + continue; + } else { + scanner.unread(); + } + } else if (c == '\\' && stringMode) { + c2 = scanner.read(); + if (c2 == '"') { + continue; + } else { + scanner.unread(); + } + } else if (c == '"') { + if (stringMode) { + stringMode = false; + } else { + stringMode = true; + } + continue; + } + if (lineCommentMode || multiLineCommentMode || stringMode) { + continue; + } + + if (c == fEscapeCharacter) { + // Skip the escaped character. + scanner.read(); + } else if (fEndSequence.length > 0 && c == fEndSequence[0]) { + // Check if the specified end sequence has been found. + if (sequenceDetected(scanner, fEndSequence, true)) + return true; + } else if (fBreaksOnEOL) { + // Check for end of line since it can be used to terminate the pattern. + for (int i = 0; i < delimiters.length; i++) { + if (c == delimiters[i][0] && sequenceDetected(scanner, delimiters[i], false)) + return true; + } + } + } + scanner.unread(); + return true; + } + } /** * Detector for empty comments. */ @@ -42,32 +127,32 @@ public class PHPPartitionScanner extends RuleBasedPartitionScanner { /* (non-Javadoc) * Method declared on IWordDetector - */ + */ public boolean isWordStart(char c) { return (c == '/'); } /* (non-Javadoc) * Method declared on IWordDetector - */ + */ public boolean isWordPart(char c) { return (c == '*' || c == '/'); } }; - + /** * */ static class WordPredicateRule extends WordRule implements IPredicateRule { - + private IToken fSuccessToken; - + public WordPredicateRule(IToken successToken) { super(new EmptyCommentDetector()); - fSuccessToken= successToken; + fSuccessToken = successToken; addWord("/**/", fSuccessToken); } - + /* * @see org.eclipse.jface.text.rules.IPredicateRule#evaluate(ICharacterScanner, boolean) */ @@ -89,32 +174,31 @@ public class PHPPartitionScanner extends RuleBasedPartitionScanner { public PHPPartitionScanner() { super(); -// IToken javaDoc= new Token(JAVA_DOC); - IToken comment= new Token(JAVA_MULTILINE_COMMENT); - IToken php = new Token(PHP); - - List rules= new ArrayList(); + // IToken javaDoc= new Token(JAVA_DOC); + IToken comment = new Token(JAVA_MULTILINE_COMMENT); + IToken php = new Token(PHP); + + List rules = new ArrayList(); // Add rule for single line comments. - // rules.add(new EndOfLineRule("//", Token.UNDEFINED)); + // rules.add(new EndOfLineRule("//", Token.UNDEFINED)); // Add rule for strings and character constants. - // rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); - // rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); + // rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); + // rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); // Add special case word rule. rules.add(new WordPredicateRule(comment)); // Add rules for multi-line comments and javadoc. //rules.add(new MultiLineRule("/**", "*/", javaDoc)); - rules.add(new MultiLineRule("", comment)); - rules.add(new MultiLineRule("", php)); - rules.add(new MultiLineRule("", php)); - rules.add(new MultiLineRule("", php)); - //Add rule for processing instructions - + rules.add(new MultiLineRule("", comment)); + rules.add(new PHPMultiLineRule("", php)); + rules.add(new PHPMultiLineRule("", php)); + rules.add(new PHPMultiLineRule("", php)); + //Add rule for processing instructions - IPredicateRule[] result= new IPredicateRule[rules.size()]; + IPredicateRule[] result = new IPredicateRule[rules.size()]; rules.toArray(result); setPredicateRules(result); }