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');

    final arraySymbolAccesserResolveResult = arrayAccesser.resolve(symbolTable);
    log.add(arraySymbolAccesserResolveResult);
    if (arraySymbolAccesserResolveResult is! Success<CitrusSymbolValue, AccesserException>) return Success(source, log);
    final bindCitrusArray = arraySymbolAccesserResolveResult.wrapped;
    if (bindCitrusArray is! CitrusArray) return Success(source, log.monitor({
        'type': bindCitrusArray.runtimeType,
    }));

    // array text, array object, object の array text の 3パターンがある
    final addTemporarySymbolResult = symbolTable.addTemporarySymbol(temporaryAccesser.identifier, bindCitrusArray);
    log.add(addTemporarySymbolResult);
    if (addTemporarySymbolResult is! Success<CitrusSymbolTable, CitrusSymbolTableException>) return Success(source, log);

    final joinAccesserResolveResult = joinAccesser.resolve(symbolTable);
    log.add(joinAccesserResolveResult);
    if (joinAccesserResolveResult is! Success<CitrusSymbolValue, AccesserException>) return Success(source, log);
    final join = joinAccesserResolveResult.wrapped;
    if (join is! EndValue) return Success(source, log.monitor({
        'type': join.runtimeType,
    }));

    final limit = bindCitrusArray.value.length;
    var count = 1;
    final List<String> list = [];
    CitrusSymbolTable newSymbolTable = addTemporarySymbolResult.wrapped;

    while (true) {

        if (count > limit) {

            final result = list.join(join.value.toString());

            return Success(result, log);

        }

        final resolveResult = finishCitrusSemanticList.resolve(newSymbolTable, generateLocation, fragments);
        log.add(resolveResult);

        list.add(resolveResult.wrapped);

        // laps を進める.
        final incrementLapsResult = newSymbolTable.incrementLaps(temporaryAccesser.identifier);
        log.add(incrementLapsResult);
        if (incrementLapsResult is! Success<CitrusSymbolTable, CitrusSymbolTableException>) return Success(source, log);

        newSymbolTable = incrementLapsResult.wrapped;

        count = count + 1;

    }

}