package bluej.parser;
import java.io.Reader;
import java.io.StringReader;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import bluej.debugger.gentype.JavaType;
import bluej.debugmgr.codepad.DeclaredVar;
import bluej.parser.entity.EntityResolver;
import bluej.parser.entity.JavaEntity;
import bluej.parser.lexer.JavaTokenTypes;
import bluej.parser.lexer.LocatableToken;
import threadchecker.OnThread;
import threadchecker.Tag;
| Parse variable declarations/initializations (for the codepad).
|
| @author Davin McCall
|
@OnThread(Tag.FXPlatform)
public class CodepadVarParser
extends JavaParser{
private EntityResolver resolver;
private int arrayCount = 0;
private int modifiers = 0;
private boolean gotFirstVar = false;
private JavaType baseType;
private List<DeclaredVar> variables = new ArrayList<DeclaredVar>();
public CodepadVarParser(EntityResolver resolver, Reader reader)
{
super(reader);
this.resolver = resolver;
}
public CodepadVarParser(EntityResolver resolver, String text)
{
this(resolver, new StringReader(text));
}
| Get the variables found to be declared by the parsed text. This should be called after
| first calling "parseVariableDeclarations()".
|
*/
public List<DeclaredVar> getVariables()
{
return variables;
}
@Override
@OnThread(value = Tag.FXPlatform, ignoreParent = true)
protected void gotTypeSpec(List<LocatableToken> tokens)
|
|
{
|
|
if (! gotFirstVar) {
|
|
JavaEntity bent = ParseUtils.getTypeEntity(resolver, null, tokens);
|
|
if (bent == null) {
|
|
return;
|
|
}
|
|
bent = bent.resolveAsType();
|
|
if (bent != null) {
|
|
baseType = bent.getType();
|
|
}
|
|
}
|
|
}
|
|
@Override
|
|
protected void gotArrayDeclarator()
|
|
{
|
|
arrayCount++;
|
|
}
|
|
@Override
|
|
protected void gotVariableDecl(LocatableToken first, LocatableToken idToken, boolean inited)
|
|
{
|
|
gotFirstVar = true;
|
|
if (baseType != null) {
|
|
JavaType vtype = baseType;
|
|
while (arrayCount > 0){
|
|
vtype = vtype.getArray();
|
|
arrayCount--;
|
|
}
|
|
variables.add(new DeclaredVar(inited, Modifier.isFinal(modifiers),
|
|
vtype, idToken.getText()));
|
|
}
|
|
}
|
|
@Override
|
|
protected void gotSubsequentVar(LocatableToken first, LocatableToken idToken, boolean inited)
|
|
{
|
|
if (baseType != null) {
|
|
JavaType vtype = baseType;
|
|
while (arrayCount > 0){
|
|
vtype = vtype.getArray();
|
|
arrayCount--;
|
|
}
|
|
variables.add(new DeclaredVar(inited, Modifier.isFinal(modifiers),
|
|
vtype, idToken.getText()));
|
|
}
|
|
}
|
|
@Override
|
|
protected void gotModifier(LocatableToken token)
|
|
{
|
|
if (! gotFirstVar) {
|
|
if (token.getType() == JavaTokenTypes.FINAL) {
|
|
modifiers |= Modifier.FINAL;
|
|
}
|
|
}
|
|
}
|
|
}