| 477 | } |
| 478 | |
| 479 | bool CompilerStack::analyze() |
| 480 | { |
| 481 | solAssert(m_stackState == ParsedAndImported, "Must call analyze only after parsing was successful."); |
| 482 | |
| 483 | if (!resolveImports()) |
| 484 | return false; |
| 485 | |
| 486 | for (Source const* source: m_sourceOrder) |
| 487 | if (source->ast) |
| 488 | Scoper::assignScopes(*source->ast); |
| 489 | |
| 490 | bool noErrors = true; |
| 491 | |
| 492 | try |
| 493 | { |
| 494 | bool experimentalSolidity = isExperimentalSolidity(); |
| 495 | |
| 496 | SyntaxChecker syntaxChecker(m_errorReporter, m_optimiserSettings.runYulOptimiser, m_experimental); |
| 497 | for (Source const* source: m_sourceOrder) |
| 498 | if (source->ast && !syntaxChecker.checkSyntax(*source->ast)) |
| 499 | noErrors = false; |
| 500 | |
| 501 | m_globalContext = std::make_shared<GlobalContext>(m_evmVersion); |
| 502 | // We need to keep the same resolver during the whole process. |
| 503 | NameAndTypeResolver resolver(*m_globalContext, m_evmVersion, m_errorReporter, experimentalSolidity); |
| 504 | for (Source const* source: m_sourceOrder) |
| 505 | if (source->ast && !resolver.registerDeclarations(*source->ast)) |
| 506 | return false; |
| 507 | |
| 508 | std::map<std::string, SourceUnit const*> sourceUnitsByName; |
| 509 | for (auto& source: m_sources) |
| 510 | sourceUnitsByName[source.first] = source.second.ast.get(); |
| 511 | for (Source const* source: m_sourceOrder) |
| 512 | if (source->ast && !resolver.performImports(*source->ast, sourceUnitsByName)) |
| 513 | return false; |
| 514 | |
| 515 | resolver.warnHomonymDeclarations(); |
| 516 | |
| 517 | { |
| 518 | DocStringTagParser docStringTagParser(m_errorReporter); |
| 519 | for (Source const* source: m_sourceOrder) |
| 520 | if (source->ast && !docStringTagParser.parseDocStrings(*source->ast)) |
| 521 | noErrors = false; |
| 522 | } |
| 523 | |
| 524 | // Requires DocStringTagParser |
| 525 | for (Source const* source: m_sourceOrder) |
| 526 | if (source->ast && !resolver.resolveNamesAndTypes(*source->ast)) |
| 527 | return false; |
| 528 | |
| 529 | if (experimentalSolidity) |
| 530 | { |
| 531 | if (!analyzeExperimental()) |
| 532 | noErrors = false; |
| 533 | } |
| 534 | else if (!analyzeLegacy(noErrors)) |
| 535 | noErrors = false; |
| 536 | } |
no test coverage detected