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..9b6420e 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 @@ -1,121 +1,454 @@ /********************************************************************** -Copyright (c) 2000, 2002 IBM Corp. and others. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Common Public License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/legal/cpl-v10.html - -Contributors: - IBM Corporation - Initial implementation - Klaus Hartlage - www.eclipseproject.de -**********************************************************************/ + Copyright (c) 2002 Widespace, OU and others. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Common Public License v1.0 + which accompanies this distribution, and is available at + http://solareclipse.sourceforge.net/legal/cpl-v10.html + + Contributors: + Igor Malinin - initial contribution + + $Id: PHPPartitionScanner.java,v 1.32 2005-10-09 12:35:01 axelcl Exp $ + **********************************************************************/ package net.sourceforge.phpeclipse.phpeditor.php; import java.util.ArrayList; -import java.util.List; -import org.eclipse.jface.text.rules.EndOfLineRule; +import java.util.HashMap; +import java.util.Map; + +import net.sourceforge.phpdt.internal.compiler.parser.Scanner; +import net.sourceforge.phpeclipse.ui.text.rules.AbstractPartitioner; + +import org.eclipse.jface.text.Assert; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.rules.ICharacterScanner; -import org.eclipse.jface.text.rules.IPredicateRule; -import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IPartitionTokenScanner; import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.IWordDetector; -import org.eclipse.jface.text.rules.MultiLineRule; -import org.eclipse.jface.text.rules.RuleBasedPartitionScanner; -import org.eclipse.jface.text.rules.RuleBasedScanner; -import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.Token; -import org.eclipse.jface.text.rules.WordRule; /** - * This scanner recognizes the JavaDoc comments and Java multi line comments. + * + * + * @author Igor Malinin */ -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"; - /** - * Detector for empty comments. +public class PHPPartitionScanner implements IPartitionTokenScanner { + public static final String PHP_SCRIPTING_AREA = "__php_scripting_area "; + + public static final int STATE_DEFAULT = 0; + + // public static final int STATE_TAG = 1; + // public static final int STATE_SCRIPT = 2; + + private IDocument document; + + // private int begin; + + private int end; + + private int offset; + + private int length; + + private int position; + + // private int state; + + private Map tokens = new HashMap(); + + public PHPPartitionScanner() { + } + + /* + * @see org.eclipse.jface.text.rules.ITokenScanner#nextToken() */ - static class EmptyCommentDetector implements IWordDetector { + public IToken nextToken() { + offset += length; - /* (non-Javadoc) - * Method declared on IWordDetector - */ - public boolean isWordStart(char c) { - return (c == '/'); + /* + * switch (state) { case STATE_TAG: return nextTagToken(); } + */ + + switch (read()) { + case ICharacterScanner.EOF: + // state = STATE_DEFAULT; + return getToken(null); + + case '<': + switch (read()) { + case ICharacterScanner.EOF: + // state = STATE_DEFAULT; + return getToken(null); + + case '?': // ': + // state = STATE_DEFAULT; + return getToken(token); + + case '?': + continue; + default: + continue; + } + } + + ch = read(); } - - /* - * @see org.eclipse.jface.text.rules.IPredicateRule#evaluate(ICharacterScanner, boolean) - */ - public IToken evaluate(ICharacterScanner scanner, boolean resume) { - return super.evaluate(scanner); + } + + private IToken getToken(String type) { + length = position - offset; + + if (length == 0) { + return Token.EOF; } - /* - * @see org.eclipse.jface.text.rules.IPredicateRule#getSuccessToken() - */ - public IToken getSuccessToken() { - return fSuccessToken; + // if (length<0) { + // try { + // System.out.println("Length<0:"+document.get(offset,5)+""+length); + // } catch (BadLocationException e) { + // e.printStackTrace(); + // } + // } + + if (type == null) { + return Token.UNDEFINED; } - }; - /** - * Creates the partitioner and sets up the appropriate rules. - */ - public PHPPartitionScanner() { - super(); + IToken token = (IToken) tokens.get(type); + if (token == null) { + token = new Token(type); + tokens.put(type, token); + } -// IToken javaDoc= new Token(JAVA_DOC); - IToken comment= new Token(JAVA_MULTILINE_COMMENT); - IToken php = new Token(PHP); - - List rules= new ArrayList(); + return token; + } - // Add rule for single line comments. - // rules.add(new EndOfLineRule("//", Token.UNDEFINED)); + private int read() { + if (position >= end) { + return ICharacterScanner.EOF; + } - // Add rule for strings and character constants. - // rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); - // rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); + try { + return document.getChar(position++); + } catch (BadLocationException e) { + --position; + return ICharacterScanner.EOF; + } + } - // Add special case word rule. - rules.add(new WordPredicateRule(comment)); + private boolean readUntilEscapedDQ() { + // search last double quoted character + try { + char ch; + while (true) { + if (position >= end) { + return false; + } + ch = document.getChar(position++); + if (ch == '\\') { + if (position >= end) { + return false; + } + ch = document.getChar(position++); // ignore escaped character + } else if (ch == '"') { + return true; + } + } + } catch (BadLocationException e) { + --position; + } + return false; + } - // 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 + private boolean readUntilEscapedSQ() { + // search last single quoted character + try { + char ch; + while (true) { + if (position >= end) { + return false; + } + ch = document.getChar(position++); + if (ch == '\\') { + if (position >= end) { + return false; + } + ch = document.getChar(position++); // ignore escaped character + } else if (ch == '\'') { + return true; + } + } + } catch (BadLocationException e) { + --position; + } + return false; + } + private boolean readUntilEscapedHEREDOC() { + // search until heredoc ends + try { + char ch; + StringBuffer buf = new StringBuffer(); + char[] heredocIdent; + if (position >= end) { + return false; + } + ch = document.getChar(position++); + if (!Scanner.isPHPIdentifierStart(ch)) { + return false; + } + while (Scanner.isPHPIdentifierPart(ch)) { + buf.append(ch); + if (position >= end) { + return false; + } + ch = document.getChar(position++); + } + heredocIdent = buf.toString().toCharArray(); + while (true) { + if (position >= end) { + return false; + } + ch = document.getChar(position++); + if (ch == '\n') { // heredoc could end after a newline + int pos = 0; + while (true) { + if (position >= end) { + return false; + } + if (pos == heredocIdent.length) { + return true; + } + ch = document.getChar(position++); // ignore escaped character + if (ch != heredocIdent[pos]) { + break; + } + pos++; + } + } + } + } catch (BadLocationException e) { + --position; + } + return false; + } - IPredicateRule[] result= new IPredicateRule[rules.size()]; - rules.toArray(result); - setPredicateRules(result); + private boolean readSingleLine() { + try { + do { + if (position >= end) { + return false; + } + } while (document.getChar(position++) != '\n'); + return true; + } catch (BadLocationException e) { + --position; + } + return false; } -} + + private boolean readMultiLineComment() { + try { + char ch; + while (true) { + if (position >= end) { + return false; + } + ch = document.getChar(position++); + if (ch == '*') { + if (position >= end) { + return false; + } + if (document.getChar(position) == '/') { + position++; + return true; + } + } + } + } catch (BadLocationException e) { + --position; + } + return false; + } + + private void unread() { + --position; + } + + /* + * @see org.eclipse.jface.text.rules.ITokenScanner#getTokenOffset() + */ + public int getTokenOffset() { + if (AbstractPartitioner.DEBUG) { + Assert.isTrue(offset >= 0, Integer.toString(offset)); + } + return offset; + } + + /* + * @see org.eclipse.jface.text.rules.ITokenScanner#getTokenLength() + */ + public int getTokenLength() { + return length; + } + + /* + * @see org.eclipse.jface.text.rules.ITokenScanner#setRange(IDocument, int, + * int) + */ + public void setRange(IDocument document, int offset, int length) { + this.document = document; + // this.begin = offset; + this.end = offset + length; + + this.offset = offset; + this.position = offset; + this.length = 0; + } + + /* + * @see org.eclipse.jface.text.rules.IPartitionTokenScanner + */ + public void setPartialRange(IDocument document, int offset, int length, String contentType, int partitionOffset) { + // state = STATE_DEFAULT; + if (partitionOffset > -1) { + int delta = offset - partitionOffset; + if (delta > 0) { + setRange(document, partitionOffset, length + delta); + return; + } + } + setRange(document, partitionOffset, length); + } + + // private boolean isContinuationPartition(IDocument document, int offset) { + // try { + // String type = document.getContentType(offset - 1); + // + // if (type != IDocument.DEFAULT_CONTENT_TYPE) { + // return true; + // } + // } catch (BadLocationException e) {} + // + // return false; + // } +} \ No newline at end of file