From 9f407167b74bc3835ded5e01e0bbc6b303219809 Mon Sep 17 00:00:00 2001 From: axelcl Date: Sun, 9 Oct 2005 11:24:39 +0000 Subject: [PATCH] Save PHPPartitionScanner for refactoring --- .../internal/ui/text/FastJavaPartitionScanner.java | 11 +- .../phpeditor/php/PHPPartitionScanner.java | 771 +++++++++++--------- 2 files changed, 428 insertions(+), 354 deletions(-) diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/FastJavaPartitionScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/FastJavaPartitionScanner.java index f902c59..fe962fb 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/FastJavaPartitionScanner.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/FastJavaPartitionScanner.java @@ -1,10 +1,10 @@ /******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials + * 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 API and implementation *******************************************************************************/ @@ -433,16 +433,16 @@ public class FastJavaPartitionScanner implements IPartitionTokenScanner, IPHPPar // fLast= (fLast == BACKSLASH) ? NONE : BACKSLASH; // fTokenLength++; // break; - // + // // case '\'': // if (fLast != BACKSLASH) { // return postFix(CHARACTER); - // + // // } else { // consume(); // break; // } - // + // // default: // consume(); // break; @@ -525,6 +525,7 @@ public class FastJavaPartitionScanner implements IPartitionTokenScanner, IPHPPar else if (contentType.equals(PHP_STRING_DQ)) return STRING_DQ; + else if (contentType.equals(PHP_STRING_SQ)) return STRING_SQ; // else if (contentType.equals(JAVA_CHARACTER)) 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 62687dd..390bba8 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 @@ -8,13 +8,15 @@ Contributors: Igor Malinin - initial contribution - $Id: PHPPartitionScanner.java,v 1.30 2005-09-30 18:10:36 axelcl Exp $ + $Id: PHPPartitionScanner.java,v 1.31 2005-10-09 11:24:07 axelcl Exp $ **********************************************************************/ package net.sourceforge.phpeclipse.phpeditor.php; +import java.util.ArrayList; 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; @@ -31,353 +33,424 @@ import org.eclipse.jface.text.rules.Token; * @author Igor Malinin */ public class PHPPartitionScanner implements IPartitionTokenScanner { - public static final String PHP_SCRIPTING_AREA = "__php_scripting_area "; + 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() - */ - public IToken nextToken() { - offset += length; - - /* - * 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(); - } - } - - private IToken getToken(String type) { - length = position - offset; - - if (length == 0) { - return Token.EOF; - } - -// 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; - } - - IToken token = (IToken) tokens.get(type); - if (token == null) { - token = new Token(type); - tokens.put(type, token); - } - - return token; - } - - private int read() { - if (position >= end) { - return ICharacterScanner.EOF; - } - - try { - return document.getChar(position++); - } catch (BadLocationException e) { - --position; - return ICharacterScanner.EOF; - } - } - - 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; - } - - 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 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; - // } + 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() + */ + public IToken nextToken() { + offset += length; + + /* + * 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(); + } + } + + private IToken getToken(String type) { + length = position - offset; + + if (length == 0) { + return Token.EOF; + } + + // 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; + } + + IToken token = (IToken) tokens.get(type); + if (token == null) { + token = new Token(type); + tokens.put(type, token); + } + + return token; + } + + private int read() { + if (position >= end) { + return ICharacterScanner.EOF; + } + + try { + return document.getChar(position++); + } catch (BadLocationException e) { + --position; + return ICharacterScanner.EOF; + } + } + + 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; + } + + 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++; + } + } else if (ch == '"') { + return true; + } + } + } catch (BadLocationException e) { + --position; + } + return false; + } + + 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 -- 1.7.1