📄 jbrowselineparser.java
字号:
} // Create and Insert Attribute Node currentElement = new UML.Attribute(memberName, memberType, mod, parentNode.getElement(), curTokenLine); insertAsNode(currentElement, curElementStartPos, parentNode); if ( ( (UML.Attribute) currentElement).isPrimitive()) { results.incPrimAttrCount(); } else { results.incObjAttrCount(); } if ( token.equals(",") ) { // more should follow memberName = null; continue; } else if ( token.equals("=") ) { // more may follow, so skip until ";" or "," if ( ",".equals( ts.skipUntil( ",;".toCharArray() )) ) { // more should follow, so maintain type but clear name memberName = null; continue; } // ";" assume found so fall into prepare for next element } // prepare for next element curElementStartPos = -1; mod = 0; memberType = null; memberName = null; } // end of else if for attributes } else if ( token.equals("[") || token.equals("]") ) { if (memberName != null) { // attribute memberName += token; } else if (memberType != null) { // attribute or method memberType += token; } else { // unexpected badFlag = true; resetFlag = true; msgStr = null; } } else if (token.equals("(") ) { if (memberType == null) { // unexpected token badFlag = true; resetFlag = true; msgStr = null; } else if (memberName == null) { // handle constructors if (memberType.equals(parentNode.getElement().getName()) ) { memberName = memberType; memberType = null; // the expected value for constructors // Check if constructor is appropriate if ( parentNode.getElement().isInterface() ) { badFlag = true; msgStr = "Interfaces can't have constructors"; } else if ( !RWModifier.isValidForConstructor(mod) ) { badFlag = true; msgStr = "Constructor can't be native/abstract/static/synchronized/final"; } } else { // Report missing name or misspelled constructor badFlag = true; if ( parentNode.getElement().isInterface() || !RWModifier.isValidForConstructor(mod) ) { memberName = MISSING_LABEL; msgStr = "Missing operation type or name"; } else { memberName = memberType; memberType = null; // the expected value for constructors msgStr = "Misspelled constructor name?"; } } } // Operation Node if ( !resetFlag ) { // Create Operation Node currentElement = new UML.Operation(memberName, memberType, mod, parentNode.getElement(), curTokenLine); if (memberType == null ) { ( ( UML.Operation) currentElement).setConstructor(true); } isBodyRequired = ( (UML.Operation) currentElement).isBodyRequired(); // Insert Operation Node nodeStack.push( parentNode = insertAsNode( currentElement, curElementStartPos, parentNode) ); results.incMethodCount(); if ( parentNode.getElement().getParentElement().isInterface() && !RWModifier.isValidInterfaceMethod(mod) ) { // Interface methods can't be native/static/synchronized/final/private/protected String msgStr2 = "Invalid modifiers for a method in an interface"; // Create error node and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr2, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); } else if (RWModifier.isAbstract(mod) && !RWModifier.isValidAbstractMethod(mod)) { // Abstract methods can't be native/static/synchronized/final/private String msgStr2 = "Invalid modifiers for an abstract method"; // Create error node and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr2, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); } // Setup for next state parseSubState = ParseSubState.OP_PARMS; lastToken = ""; // if there are any parameters signal that next token is start of first parmType = ""; parmName = ""; methodBraceCount = 0; methodParmsCount = 0; } // if ( !resetFlag ) } else if ( token.equals("{") && ( mod == RWModifier.setStatic(0) || mod == 0 ) ) { // static block or object block ts.skipUntil( "}" ); curElementStartPos = -1; mod = 0; memberType = null; memberName = null; } else if (token.equals("}") ) { // pop parent from stack //nodeStack.pop(); UMLTree.Node o = (UMLTree.Node) nodeStack.pop(); parentNode = (UMLTree.Node) nodeStack.peek(); if (parentNode == root ) { parseState = ParseState.POST_HEADER; parseSubState = ParseSubState.SCANNING; } else { parseState = ParseState.PACKAGE_MEMBER; parseSubState = ParseSubState.BODY; mod = 0; memberType = null; memberName = null; } curElementStartPos = -1; } else { // Unexpected token badFlag = true; resetFlag = true; } // if - else if for PACKAGE_MEMBER - BODY if (badFlag) { if (msgStr == null) { // Unexpected token msgStr = "Unexpected token: '" + token + "'"; } // increment count results.incErrorCount(); // attempt to continue by ignoring if (resetFlag) { // Create error node as daughter of parent messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, parentNode); curElementStartPos = -1; memberType = null; memberName = null; } else { // Create error node as sister of parent messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); badFlag = false; resetFlag = false; } } // if (badFlag) for PACKAGE_MEMBER - BODY // ------------------------------ // PACKAGE_MEMBER - OP_PARMS // ------------------------------ } else if (parseSubState == ParseSubState.OP_PARMS) { if ( token.equals(")") || token.equals(",") ) { if (! "".equals(parmType) ) { // Attempt to add the parameter // insure parameter identifier not missing if ( "".equals(parmName) ) { msgStr = "Expecting type & identifier for method parameter."; // Create error node (as sister of parent) and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); // attempt to continue as if an identifier for the parameter was found. parmName = MISSING_LABEL; } // insure closing ']' not missing if ( "[".equals(lastToken) ) { msgStr = "Missing ']' after '[' for method parameter."; // create error node (as sister of parent) and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); // attempt to continue as if "]" was found. parmType += "[]"; } // Add the parameter ( (UML.Operation) currentElement).addArgument(parmType, parmName); methodParmsCount++; } else { // i.e. parmType not specified // insure ',' was not superfluous if ( token.equals(",") ) { msgStr = "Missing method parameter before ','."; // Create error node and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); // attempt to continue as if superfluous "," was not there. } } // if (! "".equals(parmType) ) // Handle for end or more parameters ( ')' vs. ',') if (token.equals(",") ) { // Prepare for next parameter parmType = ""; // if there are any more args signal that next token is type parmName = ""; } else { // i.e. token is ")" // insure was not preceded by a superfluous ',' if ( lastToken.equals(",") ) { msgStr = "Missing method parameter after ','."; // Create error node and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); // attempt to continue as if superfluous "," was not there. } parseSubState = ParseSubState.OP_POST_PARMS; throwsFound = false; throwsOK = true; } // ( ')' vs. ',') } else { // Assume Parameter type or formal name if ( Character.isJavaIdentifierStart(tokenStartChar) ) { if ( "".equals(parmType) ) { // type parmType = token; } else if ( "[".equals(lastToken) ) { msgStr = "Missing ']' after '[' for method parameter."; // create error node and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); // attempt to continue as if "]" was found. parmType += "[]"; parmName = token; } else { // formal name parmName = token; } } else if ("[".equals(token) ) { // then check that next token is "]" } else if ("]".equals(token) ) { if ( "[".equals(lastToken) ) { parmType += "[]"; } else { msgStr = "Missing '[' before ']' for method parameter."; // Create error node and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); // attempt to continue as if "]" was found. parmType += "[]"; } } else { msgStr = "Unexpected token \"" + token + "\" in method parameter."; // Create error node and increment count results.incErrorCount(); messageElement = new UML.Message(msgStr, UML.Type.ERROR, parentNode.getElement().getParentElement(), curTokenLine); insertAsNode(messageElement, curElementStartPos, (UMLTree.Node) parentNode.getParent()); // attempt to continue (i.e. ignore) } } // if - else if for PACKAGE_MEMBER - OP_PARMS lastToken = token; // ------------------------------ // PACKAGE_MEMBER - OP_POST_PARMS // ------------------------------ } else if (parseSubState == ParseSubState.OP_POST_PARMS) { // Parameter list finished, parse throws clause // and Determine Next State badFlag = false; if ( token.equals("{") || token.equals(";") ) { if (!throwsOK) { curElementStartPos = ls.getStartOffset() + curTokenPos; curTokenLine = ts.getCurrentLineNum(); msgStr = "Missing type specification in throws clause"; // Create error node and increment count results.incErrorCount();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -