package bluej.parser.nodes;

import bluej.debugger.gentype.GenTypeClass;
import bluej.debugger.gentype.Reflective;
import bluej.editor.moe.MoeSyntaxDocument;
import bluej.parser.ExpressionTypeInfo;
import bluej.parser.JavaParser;
import bluej.parser.entity.JavaEntity;
import bluej.parser.entity.PackageOrClass;
import bluej.parser.entity.ParsedReflective;
import bluej.parser.entity.TparEntity;
import bluej.parser.entity.TypeEntity;
import bluej.parser.entity.ValueEntity;
import bluej.parser.lexer.JavaTokenTypes;
import bluej.parser.lexer.LocatableToken;
import bluej.parser.nodes.NodeTree.NodeAndPosition;
import threadchecker.OnThread;
import threadchecker.Tag;

import java.util.Collections;
import java.util.List;


| A node representing a parsed type (class, interface, enum) | | @author Davin McCall | public class ParsedTypeNode extends IncrementalParsingNode{ private String name; private String prefix; private TypeInnerNode inner; private List<TparEntity> typeParams; private List<JavaEntity> extendedTypes; private List<JavaEntity> implementedTypes; private int modifiers; private ParsedTypeNode containingClass; private int type; | Construct a new ParsedTypeNode. | | @param parent The parent node | @param containingClass The node representing the class containing this one | @param type The type of this type: JavaParser.{}YPEDEF_CLASS,_INTERFACE,_ENUM or _ANNOTATION} | @param prefix The prefix of the name, including the final ".", to make this a full |* type name * @param modifiers The class modifiers (see java.lang.reflect.Modifier) */ public ParsedTypeNode(JavaParentNode parent, ParsedTypeNode containingClass, int type, String prefix, int modifiers) | |{ | |super(parent); | |stateMarkers = new int[2]; | |marksEnd = new boolean[2]; | |stateMarkers[0] = -1; | |stateMarkers[1] = -1; | |this.type = type; | |this.prefix = prefix; | |this.modifiers = modifiers; | |this.containingClass = containingClass; | |// Set defaults for various members | |typeParams = Collections.emptyList(); | |extendedTypes = Collections.emptyList(); | |implementedTypes = Collections.emptyList(); | |} | |/** | Gets the kind of type which this node represents. Returns one of: | JavaParser.TYPEDEF_CLASS, _INTERFACE, _ENUM or _ANNOTATION | public int getTypeKind() { return type; }
| Get the modifiers of the type this node represents (see java.lang.reflect.Modifier). | public int getModifiers() { return modifiers; }
| Get the node representing the class containing this one. | public ParsedTypeNode getContainingClass() { return containingClass; }
| Set the type parameters for this type (empty list for none). | public void setTypeParams(List<TparEntity> typeParams) { this.typeParams = typeParams; }
| Get the type parameters for this type (empty list if none). | public List getTypeParams() { return typeParams; }
| Set the types that this type is declared to implement (empty list for none). | public void setImplementedTypes(List<JavaEntity> implementedTypes) { this.implementedTypes = implementedTypes; }
| Get the types this type is declared to implement (empty list if none). | public List getImplementedTypes() { return implementedTypes; }
| Specify which types this type explicitly extends (empty list for none). | public void setExtendedTypes(List<JavaEntity> extendedTypes) { this.extendedTypes = extendedTypes; }
| Return the types which this type explicit extends. | For an anonymous inner class, the returned list will contain a single | type which may be a class or interface. | public List getExtendedTypes() { return extendedTypes; } @Override public int getNodeType() { return NODETYPE_TYPEDEF; } @Override public boolean isContainer() { return true; }
| Set the unqualified name of the type this node represents. | public void setName(String name) { String oldName = this.name; this.name = name; getParentNode().childChangedName(this, oldName); } @Override public String getName() { return name; }
| Get the package qualification prefix for the type this node represents. | public String getPrefix() { return prefix; }
| Insert the inner node for the type definition. | The inner node will hold the field definitions etc. | public void insertInner(TypeInnerNode child, int position, int size) { super.insertNode(child, position, size); inner = child; stateMarkers[1] = position + size; }
| Get the inner node for the type, if one exists. May return null. | public TypeInnerNode getInner() { return inner; } @Override protected void childRemoved(NodeAndPosition<ParsedNode> child, NodeStructureListener listener) { if (child.getNode() == inner) { inner = null; stateMarkers[1] = -1; } super.childRemoved(child, listener); } @Override @OnThread(Tag.FXPlatform) protected int doPartialParse(ParseParams params, int state) { if (state == 0) { LocatableToken la = params.tokenStream.LA(1); setCommentAttached(la.getHiddenBefore() != null); int r = params.parser.parseTypeDefBegin(); if (r == JavaParser.TYPEDEF_EPIC_FAIL) { return PP_EPIC_FAIL; } type = r; params.parser.initializeTypeExtras(); LocatableToken token = params.tokenStream.nextToken(); if (token.getType() != JavaTokenTypes.IDENT) { last = token; return PP_INCOMPLETE; } setName(token.getText()); token = params.parser.parseTypeDefPart2(); if (token == null) { last = params.tokenStream.LA(1); return PP_INCOMPLETE; } last = token; params.tokenStream.pushBack(token); setExtendedTypes(params.parser.getExtendedTypes()); setTypeParams(params.parser.getTparList(this)); return PP_BEGINS_NEXT_STATE; } else if (state == 1) { last = params.tokenStream.nextToken(); if (last.getType() != JavaTokenTypes.LCURLY) { return PP_REGRESS_STATE; } if (inner == null) { int oldStateMarker = stateMarkers[1]; last = params.parser.parseTypeBody(type, last); if (last.getType() == JavaTokenTypes.RCURLY) { inner.setComplete(true); } params.tokenStream.pushBack(last); stateMarkers[1] = oldStateMarker; return PP_BEGINS_NEXT_STATE; } NodeAndPosition<ParsedNode> nextChild = params.childQueue.peek(); while (nextChild != null && nextChild.getNode() != inner){ childRemoved(nextChild, params.listener); params.childQueue.poll(); nextChild = params.childQueue.peek(); } params.abortPos = lineColToPos(params.document, last.getEndLine(), last.getEndColumn()); return PP_PULL_UP_CHILD; } else if (state == 2) { last = params.tokenStream.nextToken(); int innerOffset = inner.getOffsetFromParent(); int innerPos = innerOffset + params.nodePos; int innerSize = inner.getSize(); if (last.getType() != JavaTokenTypes.RCURLY) { inner.setComplete(false); inner.setSize(getSize() - innerOffset); params.listener.nodeChangedLength( new NodeAndPosition<ParsedNode>(inner, innerPos, getSize() - innerOffset), innerPos, innerSize); stateMarkers[1] = getSize(); params.document.scheduleReparse(innerPos + innerSize, getSize() - innerOffset - innerSize); params.abortPos = innerPos + innerSize; complete = false; return PP_ABORT; } int lastPos = lineColToPos(params.document, last.getLine(), last.getColumn()); if ((innerPos + innerSize) != lastPos || ! inner.complete) { inner.complete = false; lastPos = lineColToPos(params.document, last.getEndLine(), last.getEndColumn()); inner.setSize(lastPos - innerPos); params.listener.nodeChangedLength( new NodeAndPosition<ParsedNode>(inner, innerPos, lastPos - innerPos), innerPos, innerSize); stateMarkers[1] = lastPos - params.nodePos; params.document.scheduleReparse(innerPos + innerSize, lastPos - innerPos - innerSize); params.abortPos = innerPos + innerSize; return PP_ABORT; } return PP_ENDS_NODE_AFTER; } return PP_EPIC_FAIL; } @Override protected boolean isDelimitingNode(NodeAndPosition<ParsedNode> nap) { return nap.getNode().isInner(); } @Override protected boolean isNodeEndMarker(int tokenType) { return false; } @Override protected boolean marksOwnEnd() { return true; } @Override public void childResized(MoeSyntaxDocument document, int nodePos, NodeAndPosition<ParsedNode> child) { if (child.getNode() == inner) { stateMarkers[1] = child.getEnd() - nodePos; } } @Override public ExpressionTypeInfo getExpressionType(int pos, int nodePos, JavaEntity defaultType, MoeSyntaxDocument document) { valueEntityCache.clear(); pocEntityCache.clear(); ValueEntity myType = new ValueEntity(new GenTypeClass(new ParsedReflective(this))); NodeAndPosition<ParsedNode> child = getNodeTree().findNode(pos, nodePos); if (child != null) { return child.getNode().getExpressionType(pos, child.getPosition(), myType, document); } return null; } @Override public PackageOrClass resolvePackageOrClass(String name, Reflective querySource) { if (typeParams != null) { JavaEntity ent = null; for (TparEntity tent : typeParams) { if (tent.getName().equals(name)) { ent = tent; break; } } if (ent != null) { TypeEntity tent = ent.resolveAsType(); if (tent != null) { return tent; } } } return super.resolvePackageOrClass(name, querySource); } }
top, use, map, class ParsedTypeNode

.   getTypeKind
.   getModifiers
.   getContainingClass
.   setTypeParams
.   getTypeParams
.   setImplementedTypes
.   getImplementedTypes
.   setExtendedTypes
.   getExtendedTypes
.   getNodeType
.   isContainer
.   setName
.   getName
.   getPrefix
.   insertInner
.   getInner
.   childRemoved
.   doPartialParse
.   isDelimitingNode
.   isNodeEndMarker
.   marksOwnEnd
.   childResized
.   getExpressionType
.   resolvePackageOrClass




451 neLoCode + 40 LoComm