Ejemplo n.º 1
0
  /*
   * import
   *   : "import" ("namespace" ".")? SimpleName{"."} ("." "*" | "as" SimpleName)? SEMI?
   *   ;
   */
  private void parseImportDirective() {
    assert _at(IMPORT_KEYWORD);
    PsiBuilder.Marker importDirective = mark();
    advance(); // IMPORT_KEYWORD

    PsiBuilder.Marker qualifiedName = mark();
    if (at(PACKAGE_KEYWORD)) {
      advance(); // PACKAGE_KEYWORD
      expect(DOT, "Expecting '.'", TokenSet.create(IDENTIFIER, MUL, SEMICOLON));
    }

    PsiBuilder.Marker reference = mark();
    expect(IDENTIFIER, "Expecting qualified name");
    reference.done(REFERENCE_EXPRESSION);

    while (at(DOT) && lookahead(1) != MUL) {
      advance(); // DOT

      reference = mark();
      if (expect(
          IDENTIFIER,
          "Qualified name must be a '.'-separated identifier list",
          IMPORT_RECOVERY_SET)) {
        reference.done(REFERENCE_EXPRESSION);
      } else {
        reference.drop();
      }

      PsiBuilder.Marker precede = qualifiedName.precede();
      qualifiedName.done(DOT_QUALIFIED_EXPRESSION);
      qualifiedName = precede;
    }
    qualifiedName.drop();

    if (at(DOT)) {
      advance(); // DOT
      assert _at(MUL);
      advance(); // MUL
      handleUselessRename();
    }
    if (at(AS_KEYWORD)) {
      advance(); // AS_KEYWORD
      expect(IDENTIFIER, "Expecting identifier", TokenSet.create(SEMICOLON));
    }
    consumeIf(SEMICOLON);
    importDirective.done(IMPORT_DIRECTIVE);
  }