resolve method

  1. @override
Danger<List<FileSystemModelRoute>, CitrusSemanticException> resolve(
  1. CitrusSymbolTable symbolTable,
  2. FileSystemModelRoute target,
  3. FileSystemModelRouteRoster<FileSystemModelRoute> base
)
override

Implementation

@override
Danger<List<FileSystemModelRoute>, CitrusSemanticException> resolve(CitrusSymbolTable symbolTable, FileSystemModelRoute target, FileSystemModelRouteRoster<FileSystemModelRoute> base) {

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

    final arrayAccesserResolveResult = arrayAccesser.resolve(symbolTable);
    log.add(arrayAccesserResolveResult);
    if (arrayAccesserResolveResult is! Success<CitrusDataType, AccesserException>) return Failure(arrayAccesserResolveResult.asException, log);

    final bindCitrusArray = arrayAccesserResolveResult.wrapped;
    if (bindCitrusArray is! CitrusArray) return Failure(ForAloneBlockExceptionD(), log.monitor({
        'type': bindCitrusArray.runtimeType,
    }));

    final getLoopTargetResult = getLoopTarget(target, base);
    log.add(getLoopTargetResult);

    final List<FileSystemModelRoute> list = [];

    for (final citrusArrayable in bindCitrusArray.value) {

        late final String defineSyntaxSource;
        final accesser = temporaryAccessor.identifier;

        switch (citrusArrayable) {
        case CitrusText(): defineSyntaxSource = Define.from(DefineText(), accesser, citrusArrayable.value).source;
        case CitrusObject(): defineSyntaxSource = Define.from(DefineObject(), accesser, citrusArrayable.toTemplate()).source;
        }

        // すべての name と content と location に define の記述を冒頭に追加する
        for (final i in getLoopTargetResult.wrapped) {

            switch (i) {
            case FileModelRoute():

                final name = defineSyntaxSource + i.name;
                final content = Uint8List.fromList([...defineSyntaxSource.codeUnits, ...i.content]);
                final location = List.generate(i.location.length, (index) => defineSyntaxSource + i.location.elementAt(index));

                final result = FileModelRoute(location, name, content);

                list.add(result);

            case FolderModelRoute():

                final name = defineSyntaxSource + i.name;
                final location = List.generate(i.location.length, (index) => defineSyntaxSource + i.location.elementAt(index));

                final result = FolderModelRoute(location, name);

                list.add(result);

            // 対応していない.
            case LinkModelRoute(): Result.panic(CitrusSemanticErrorA(), log);
            }

        }

    }

    return Success(list, log);

}