resolve method

  1. @override
Success<String, CitrusSemanticException> resolve(
  1. CitrusSymbolTable symbolTable,
  2. String generateLocation,
  3. Iterable<String> fragments
)
override

Implementation

@override
Success<String, CitrusSemanticException> resolve(CitrusSymbolTable symbolTable, String generateLocation, Iterable<String> fragments) {

    final log = Log(classLocation: runtimeType, functionLocation: 'resolve');

    // まず fragment 内の define を読み込む.
    final getResult = symbolTable.fragmentSymbolRoster.getByPrimaryKey(singleAccesser.identifier);
    log.add(getResult);
    if (getResult is! Success<FragmentSymbol, RosterPatternExceptionB>) return Success(source, log);

    final rootCitrusSyntaxResult = RootCitrusSyntax.fromFinishSource(getResult.wrapped.value.value);
    log.add(rootCitrusSyntaxResult);

    final finishResult = Finish.fromRootCitrusSyntax(rootCitrusSyntaxResult.wrapped);
    log.add(finishResult);
    final finish = finishResult.wrapped;

    final aheadResolveResult = finish.aheadResolve(symbolTable, generateLocation, fragments);
    log.add(aheadResolveResult);
    if (aheadResolveResult is! Success<CitrusSymbolTable, CitrusSemanticException>) return Success(source, log);

    var chainSource = '';
    var newSymbolTable = aheadResolveResult.wrapped;

    // block 内の特定の semantic だけ解決する.
    // ここでは define を取り込んだ symbol table を使う必要はない.
    for (final i in matureCitrusSemanticList) {

        late final Success<String, CitrusSemanticException> result;

        switch (i) {
        case Bind(): result = i.resolve(newSymbolTable, generateLocation, fragments);
        case ConstantPart(): result = i.resolve(newSymbolTable, generateLocation, fragments);
        case EscapeSequence(): result = i.resolve(newSymbolTable, generateLocation, fragments);
        case _: result = Success(i.source);
        }

        chainSource = chainSource + result.wrapped;

    }

    final chainResult = Chain.fromSource(chainSource);
    log.add(chainResult);
    if (chainResult is! Success<Chain, ChainException>) return Success(source, log);

    // 引数を を symbol table に put する.
    for (final i in chainResult.wrapped.bodyList) {

        final symbol = CitrusSymbol.fromChain(i);

        final result = newSymbolTable.putSymbol(symbol);
        log.add(result);
        if (result is! Success<CitrusSymbolTable, CitrusSymbolTableException>) return Success(source, log);

        newSymbolTable = result.wrapped;

    }

    // print(finish.finishCitrusSemanticList.first);

    final result = finish.finishResolve(newSymbolTable, '', []);
    log.add(result);

    return Success(result.wrapped, log);

}