analyze method

Future<AnalyzedUnit> analyze(
  1. String uri,
  2. String text
)

Implementation

Future<AnalyzedUnit> analyze(String uri, String text) async {
  final lineIndex = LineIndex(text);
  final tokenIndex = TokenIndex.scan(text);
  final docs = DocExtractor(text);
  final language = languageOf(uri) ?? 'dart';

  final parser = _vm.getParser<String>(language);
  final diagnostics = <Diagnostic>[];
  ASTRoot? ast;
  var symbols = const <SymbolInfo>[];

  if (parser == null) {
    diagnostics.add(
      Diagnostic(
        range: lineIndex.rangeAt(0, 0),
        message: "No ApolloVM parser for language '$language'.",
        severity: DiagnosticSeverity.warning,
      ),
    );
  } else {
    ParseResult<String> result;
    try {
      result = await parser.parse(SourceCodeUnit(language, text, id: uri));
    } catch (e) {
      result = ParseResult(
        SourceCodeUnit(language, text, id: uri),
        errorMessage: e.toString(),
      );
    }

    if (result.isOK) {
      ast = result.root;
      symbols = collectSymbols(ast!);
      diagnostics.addAll(_importDiagnostics(ast, text, lineIndex));
    } else {
      diagnostics.add(
        _parseErrorDiagnostic(result, lineIndex, text, language),
      );
    }
  }

  return AnalyzedUnit(
    uri: uri,
    language: language,
    text: text,
    lineIndex: lineIndex,
    tokenIndex: tokenIndex,
    docs: docs,
    ast: ast,
    symbols: symbols,
    diagnostics: diagnostics,
  );
}