resolve method
Success<String, CitrusSemanticException>
resolve(
- CitrusSymbolTable symbolTable,
- String generateLocation,
- 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);
}