Skip to content

Commit

Permalink
⚡️ Optimize non-AST compilation on CLI with Solidity >= 0.8.28
Browse files Browse the repository at this point in the history
  • Loading branch information
michprev committed Oct 9, 2024
1 parent f2be0e6 commit 7e800a9
Showing 1 changed file with 28 additions and 1 deletion.
29 changes: 28 additions & 1 deletion wake/compiler/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,25 @@ def create_build_settings(

return settings

@staticmethod
def optimize_build_settings(
settings: SolcInputSettings,
modified_source_units: Iterable[str],
) -> SolcInputSettings:
if settings.output_selection is not None and "*" in settings.output_selection["*"]:
new_selection = {}
if "" in settings.output_selection["*"]:
new_selection[""] = settings.output_selection["*"][""]

for source_unit in modified_source_units:
new_selection[source_unit] = settings.output_selection["*"]["*"]

ret = settings.model_copy()
ret.output_selection = new_selection
return ret
else:
return settings

def determine_solc_versions(
self,
compilation_units: Iterable[CompilationUnit],
Expand Down Expand Up @@ -1006,6 +1025,7 @@ async def compile(
files_to_compile = set(
source_units_to_paths[source_unit] for source_unit in graph.nodes
)
source_units_to_compile = set(graph.nodes)

if not incremental:
compilation_units = self.merge_compilation_units(
Expand All @@ -1027,6 +1047,7 @@ async def compile(
# TODO this is not needed? graph contains hash of modified files
# files_to_compile = set(modified_files.keys())
files_to_compile = set()
source_units_to_compile = set()

for source_unit in graph.nodes:
if (
Expand All @@ -1037,6 +1058,7 @@ async def compile(
!= graph.nodes[source_unit]["hash"]
):
files_to_compile.add(source_units_to_paths[source_unit])
source_units_to_compile.add(source_unit)

for source_unit, info in self._latest_build_info.source_units_info.items():
if source_unit not in graph.nodes:
Expand Down Expand Up @@ -1117,11 +1139,16 @@ async def compile(

tasks = []
for compilation_unit, target_version in zip(compilation_units, target_versions):
if target_version >= "0.8.28":
settings = self.optimize_build_settings(build_settings[compilation_unit.subproject], compilation_unit.source_unit_names & source_units_to_compile)
else:
settings = build_settings[compilation_unit.subproject]

task = asyncio.create_task(
self.compile_unit_raw(
compilation_unit,
target_version,
build_settings[compilation_unit.subproject],
settings,
logger,
)
)
Expand Down

0 comments on commit 7e800a9

Please sign in to comment.