blob: 8dac4c9446f67bb677c26815d82995390914538d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Matt Chapman - initial version
*******************************************************************************/
package org.eclipse.ajdt.core;
import java.lang.reflect.Field;
import org.eclipse.ajdt.core.javaelements.AspectElement;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.core.JavaElement;
import org.eclipse.jdt.internal.core.util.MementoTokenizer;
public class AJMementoTokenizer extends MementoTokenizer {
private static final String COUNT = Character.toString(JavaElement.JEM_COUNT);
private static final String JAVAPROJECT = Character.toString(JavaElement.JEM_JAVAPROJECT);
private static final String PACKAGEFRAGMENTROOT = Character.toString(JavaElement.JEM_PACKAGEFRAGMENTROOT);
private static final String PACKAGEFRAGMENT = Character.toString(JavaElement.JEM_PACKAGEFRAGMENT);
private static final String FIELD = Character.toString(JavaElement.JEM_FIELD);
private static final String METHOD = Character.toString(JavaElement.JEM_METHOD);
private static final String INITIALIZER = Character.toString(JavaElement.JEM_INITIALIZER);
private static final String COMPILATIONUNIT = Character.toString(JavaElement.JEM_COMPILATIONUNIT);
private static final String CLASSFILE = Character.toString(JavaElement.JEM_CLASSFILE);
private static final String TYPE = Character.toString(JavaElement.JEM_TYPE);
private static final String PACKAGEDECLARATION = Character.toString(JavaElement.JEM_PACKAGEDECLARATION);
private static final String IMPORTDECLARATION = Character.toString(JavaElement.JEM_IMPORTDECLARATION);
private static final String LOCALVARIABLE = Character.toString(JavaElement.JEM_LOCALVARIABLE);
private static final String TYPE_PARAMETER = Character.toString(JavaElement.JEM_TYPE_PARAMETER);
private static final String ANNOTATION = Character.toString(JavaElement.JEM_ANNOTATION);
// begin AspectJ change
private static final String ASPECT_CU = Character
.toString(AspectElement.JEM_ASPECT_CU);
private static final String ADVICE = Character
.toString(AspectElement.JEM_ADVICE);
private static final String ASPECT_TYPE = Character
.toString(AspectElement.JEM_ASPECT_TYPE);
private static final String CODEELEMENT = Character
.toString(AspectElement.JEM_CODEELEMENT);
private static final String ITD_METHOD = Character.toString(AspectElement.JEM_ITD_METHOD);
private static final String ITD_FIELD = Character.toString(AspectElement.JEM_ITD_FIELD);
private static final String DECLARE = Character
.toString(AspectElement.JEM_DECLARE);
private static final String POINTCUT = Character
.toString(AspectElement.JEM_POINTCUT);
// end AspectJ change
private final char[] memento;
private final int length;
private int index = 0;
public AJMementoTokenizer(String memento) {
super(memento);
this.memento = memento.toCharArray();
this.length = this.memento.length;
}
public AJMementoTokenizer(MementoTokenizer tokenizer) {
super(String.valueOf((char[]) ReflectionUtils.getPrivateField(MementoTokenizer.class, "memento", tokenizer)));
memento = (char[]) ReflectionUtils.getPrivateField(MementoTokenizer.class, "memento", tokenizer);
length = memento.length;
index = (Integer) ReflectionUtils.getPrivateField(MementoTokenizer.class, "index", tokenizer);
ReflectionUtils.setPrivateField(MementoTokenizer.class, "index", this, index);
}
/**
* create a memento tokenizer that is reset to the token after the given name
*/
public AJMementoTokenizer(MementoTokenizer tokenizer, String resetToName) {
super(String.valueOf((char[]) ReflectionUtils.getPrivateField(MementoTokenizer.class, "memento", tokenizer)));
memento = (char[]) ReflectionUtils.getPrivateField(MementoTokenizer.class, "memento", tokenizer);
length = memento.length;
// only reset to the given name if it is found
int nameIndex = CharOperation.indexOf(resetToName.toCharArray(), memento, true);
if (index >= 0) {
index = nameIndex + resetToName.length();
} else {
index = (Integer) ReflectionUtils.getPrivateField(MementoTokenizer.class, "index", tokenizer);
}
ReflectionUtils.setPrivateField(MementoTokenizer.class, "index", this, index);
}
public boolean hasMoreTokens() {
return this.index < this.length;
}
public String nextToken() {
int start = this.index;
StringBuffer buffer = null;
switch (this.memento[this.index++]) {
case JavaElement.JEM_ESCAPE:
buffer = new StringBuffer();
buffer.append(this.memento[this.index]);
start = ++this.index;
break;
case JavaElement.JEM_COUNT:
return COUNT;
case JavaElement.JEM_JAVAPROJECT:
return JAVAPROJECT;
case JavaElement.JEM_PACKAGEFRAGMENTROOT:
return PACKAGEFRAGMENTROOT;
case JavaElement.JEM_PACKAGEFRAGMENT:
return PACKAGEFRAGMENT;
case JavaElement.JEM_FIELD:
return FIELD;
case JavaElement.JEM_METHOD:
return METHOD;
case JavaElement.JEM_INITIALIZER:
return INITIALIZER;
case JavaElement.JEM_COMPILATIONUNIT:
return COMPILATIONUNIT;
case JavaElement.JEM_CLASSFILE:
return CLASSFILE;
case JavaElement.JEM_TYPE:
return TYPE;
case JavaElement.JEM_PACKAGEDECLARATION:
return PACKAGEDECLARATION;
case JavaElement.JEM_IMPORTDECLARATION:
return IMPORTDECLARATION;
case JavaElement.JEM_LOCALVARIABLE:
return LOCALVARIABLE;
case JavaElement.JEM_TYPE_PARAMETER:
return TYPE_PARAMETER;
case JavaElement.JEM_ANNOTATION:
return ANNOTATION;
// begin AspectJ change
case AspectElement.JEM_ADVICE:
return ADVICE;
case AspectElement.JEM_ASPECT_TYPE:
return ASPECT_TYPE;
case AspectElement.JEM_CODEELEMENT:
return CODEELEMENT;
case AspectElement.JEM_ITD_METHOD:
return ITD_METHOD;
case AspectElement.JEM_ITD_FIELD:
return ITD_FIELD;
case AspectElement.JEM_DECLARE:
return DECLARE;
case AspectElement.JEM_POINTCUT:
return POINTCUT;
case AspectElement.JEM_ASPECT_CU:
// only return here if JDT weaving is off
// if JDT weaving is on, then a * here
// means that we are in an on demand import declaration
if (!AspectJPlugin.USING_CU_PROVIDER) {
return ASPECT_CU;
}
// end AspectJ change
}
loop: while (this.index < this.length) {
switch (this.memento[this.index]) {
case JavaElement.JEM_ESCAPE:
if (buffer == null)
buffer = new StringBuffer();
buffer.append(this.memento, start, this.index - start);
start = ++this.index;
break;
case JavaElement.JEM_COUNT:
case JavaElement.JEM_JAVAPROJECT:
case JavaElement.JEM_PACKAGEFRAGMENTROOT:
case JavaElement.JEM_PACKAGEFRAGMENT:
case JavaElement.JEM_FIELD:
case JavaElement.JEM_METHOD:
case JavaElement.JEM_INITIALIZER:
case JavaElement.JEM_COMPILATIONUNIT:
case JavaElement.JEM_CLASSFILE:
case JavaElement.JEM_TYPE:
case JavaElement.JEM_PACKAGEDECLARATION:
case JavaElement.JEM_IMPORTDECLARATION:
case JavaElement.JEM_LOCALVARIABLE:
case JavaElement.JEM_TYPE_PARAMETER:
case JavaElement.JEM_ANNOTATION:
// begin AspectJ change
case AspectElement.JEM_ADVICE:
case AspectElement.JEM_ASPECT_TYPE:
case AspectElement.JEM_CODEELEMENT:
case AspectElement.JEM_ITD_METHOD:
case AspectElement.JEM_ITD_FIELD:
case AspectElement.JEM_DECLARE:
case AspectElement.JEM_POINTCUT:
break loop;
// end AspectJ change
// begin AspectJ change
case AspectElement.JEM_ASPECT_CU:
// only break here if JDT weaving is off
// if JDT weaving is on, then a * here
// means that we are in an on demand import declaration
if (!AspectJPlugin.USING_CU_PROVIDER) {
break loop;
}
// end AspectJ change
}
this.index++;
}
if (buffer != null) {
buffer.append(this.memento, start, this.index - start);
return buffer.toString();
}
return new String(this.memento, start, this.index - start);
}
void setIndexTo(int newIndex) {
this.index = newIndex;
}
}