コード例 #1
0
  @Override
  public void tokenFound(
      TokenType type, String value, boolean inComment, int linenumber, int start, int end) {

    if (inComment) {
      if (!TokenType.COMMENT.equals(type)
          && !TokenType.BLOCK_COMMENT_START.equals(type)
          && !TokenType.BLOCK_COMMENT_END.equals(type)) {

        if (linenumber > lastCommentLine && TokenType.DIVIDE.equals(type)) {
          lastCommentLine = linenumber;
        } else {
          comment.append(value);
          lastCommentLine = linenumber;
        }
      }
      return;
    }

    handleVarBufferFlush(type);

    if (linenumber - lastCommentLine > 1) {
      comment = new StringBuffer();
    }

    // System.out.println(state);

    if (!inComment) {

      switch (state) {
        case START:
          if (TokenType.VAR.equals(type)) {
            state = State.SIMPLE_VAR;

          } else if ((TokenType.INFERENCE.equals(type))) {
            // TODO this inference parsing does not work
            // System.out.println("State Changed On: "+ type +":"+ value);
            state = State.INFERENCE;
          }
          break;

          // var name type
        case SIMPLE_VAR:
          if (TokenType.IDENTIFIER.equals(type)) {
            var.setName(value);
            var.setInsertionText(value);
            var.setDocumentation(comment.toString());
            var.setLine(linenumber);
            state = State.SIMPLE_TYPE;
          }
          break;

        case SIMPLE_TYPE:
          boolean found = false;

          // this isn't very clean, I'll have to come back a rethink all this
          // is TypeClass enough???
          if (TokenType.IDENTIFIER.equals(type)) {
            var.setTypeClass(TypeClass.USER);
            var.setName(var.getName() + " : " + value);
            found = true;
          } else if (TokenType.UINT.equals(type)) {
            var.setTypeClass(TypeClass.UINT);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.UINT8.equals(type)) {
            var.setTypeClass(TypeClass.UINT8);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.UINT16.equals(type)) {
            var.setTypeClass(TypeClass.UINT16);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.UINT32.equals(type)) {
            var.setTypeClass(TypeClass.UINT32);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.UINT64.equals(type)) {
            var.setTypeClass(TypeClass.UINT64);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.RUNE.equals(type)) {
            var.setTypeClass(TypeClass.RUNE);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.INT.equals(type)) {
            var.setTypeClass(TypeClass.INT);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.INT8.equals(type)) {
            var.setTypeClass(TypeClass.INT8);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.INT16.equals(type)) {
            var.setTypeClass(TypeClass.INT16);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.INT32.equals(type)) {
            var.setTypeClass(TypeClass.INT32);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.INT64.equals(type)) {
            var.setTypeClass(TypeClass.INT64);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.FLOAT32.equals(type)) {
            var.setTypeClass(TypeClass.FLOAT32);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.FLOAT64.equals(type)) {
            var.setTypeClass(TypeClass.FLOAT64);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.BYTE.equals(type)) {
            var.setTypeClass(TypeClass.BYTE);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.UINTPTR.equals(type)) {
            var.setTypeClass(TypeClass.UINTPTR);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.STRING.equals(type)) {
            var.setTypeClass(TypeClass.STRING);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.BOOL.equals(type)) {
            var.setTypeClass(TypeClass.BOOL);
            var.setName(var.getName() + " : " + type.getText());
            found = true;
          } else if (TokenType.CHAN.equals(type)) {
            var.setTypeClass(TypeClass.CHAN);
            var.setChan(true);
            found = true;
          } else if (TokenType.MAP.equals(type)) {
            var.setTypeClass(TypeClass.MAP);
            var.setMap(true);
            found = true;
          } else if (TokenType.LBRACKET.equals(type)) {
            var.setTypeClass(TypeClass.ARRAY);
            var.setArray(true);
            found = false;
          } else if (TokenType.MULTIPLY.equals(type)) {
            var.setPointer(true);
            found = false;
          }

          if (found) {

            state = State.START;
            vars.add(var);
            var.setLine(linenumber);

            if (scopeParser != null) {
              scopeParser.addVariable(var);
            }

            var = new Var();
            var.setFile(file);
            comment = new StringBuffer();
          }

          break;

        case INFERENCE:
          for (String s : previousIdentifier) {

            if (var.getInsertionText() == null) {
              var.setInsertionText(s);
            }

            state = State.START;
            vars.add(var);
            var.setLine(linenumber);

            if (scopeParser != null) {
              scopeParser.addVariable(var);
            }

            var = new Var();
            var.setFile(file);
            comment = new StringBuffer();
          }

          previousIdentifier.clear();
          break;
      }
    }

    // keep track of the last identifier for inferenced variables
    if (TokenType.IDENTIFIER.equals(type)) {
      previousIdentifier.add(value);

    } else if (!TokenType.COMMA.equals(type)
        && !TokenType.SPACE.equals(type)
        && !TokenType.NEWLINE.equals(type)
        && !TokenType.TAB.equals(type)
        && !TokenType.TYPE.equals(type)) {

      previousIdentifier.clear();
    }
  }