Skip to content
Merged
3 changes: 2 additions & 1 deletion src/codegen/sdk/codebase/codebase_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
logger = logging.getLogger(__name__)


GLOBAL_FILE_IGNORE_LIST = [".git/*", ".yarn/releases/*", ".*/tests/static/chunk-.*.js", ".*/ace/.*.js"]
# src/vs/platform/contextview/browser/contextMenuService.ts is ignored as there is a parsing error with tree-sitter
GLOBAL_FILE_IGNORE_LIST = [".git/*", ".yarn/releases/*", ".*/tests/static/chunk-.*.js", ".*/ace/.*.js", "src/vs/platform/contextview/browser/contextMenuService.ts"]


@unique
Expand Down Expand Up @@ -138,8 +139,8 @@
self.config = config
self.repo_name = context.repo_operator.repo_name
self.repo_path = str(Path(context.repo_operator.repo_path).resolve())
self.codeowners_parser = context.repo_operator.codeowners_parser

Check failure on line 142 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Incompatible types in assignment (expression has type "Callable[[], CodeOwners | None]", variable has type "CodeOwners | None") [assignment]
self.base_url = context.repo_operator.base_url

Check failure on line 143 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Incompatible types in assignment (expression has type "Callable[[], str | None]", variable has type "str | None") [assignment]
# =====[ computed attributes ]=====
self.transaction_manager = TransactionManager()
self._autocommit = AutoCommit(self)
Expand Down Expand Up @@ -182,7 +183,7 @@
syncs[SyncType.ADD].append(self.to_absolute(filepath))
logger.info(f"> Parsing {len(syncs[SyncType.ADD])} files in {self.projects[0].subdirectories or 'ALL'} subdirectories with {self.extensions} extensions")
self._process_diff_files(syncs, incremental=False)
files: list[SourceFile] = self.get_nodes(NodeType.FILE)

Check failure on line 186 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Incompatible types in assignment (expression has type "list[Importable[Any]]", variable has type "list[SourceFile[Any, Any, Any, Any, Any, Any]]") [assignment]
logger.info(f"> Found {len(files)} files")
logger.info(f"> Found {len(self.nodes)} nodes and {len(self.edges)} edges")
if self.config.feature_flags.track_graph:
Expand Down Expand Up @@ -212,8 +213,8 @@
elif diff.change_type == ChangeType.Modified:
files_to_sync[filepath] = SyncType.REPARSE
elif diff.change_type == ChangeType.Renamed:
files_to_sync[diff.rename_from] = SyncType.DELETE

Check failure on line 216 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Invalid index type "Path | None" for "dict[Path, SyncType]"; expected type "Path" [index]
files_to_sync[diff.rename_to] = SyncType.ADD

Check failure on line 217 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Invalid index type "Path | None" for "dict[Path, SyncType]"; expected type "Path" [index]
elif diff.change_type == ChangeType.Removed:
files_to_sync[filepath] = SyncType.DELETE
else:
Expand Down Expand Up @@ -250,10 +251,10 @@
files_to_write.append((sync.path, sync.old_content))
modified_files.add(sync.path)
elif sync.change_type == ChangeType.Renamed:
files_to_write.append((sync.rename_from, sync.old_content))

Check failure on line 254 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Argument 1 to "append" of "list" has incompatible type "tuple[Path | None, bytes | None]"; expected "tuple[Path, bytes | None]" [arg-type]
files_to_remove.append(sync.rename_to)
modified_files.add(sync.rename_from)

Check failure on line 256 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Argument 1 to "add" of "set" has incompatible type "Path | None"; expected "Path" [arg-type]
modified_files.add(sync.rename_to)

Check failure on line 257 in src/codegen/sdk/codebase/codebase_graph.py

View workflow job for this annotation

GitHub Actions / mypy

error: Argument 1 to "add" of "set" has incompatible type "Path | None"; expected "Path" [arg-type]
elif sync.change_type == ChangeType.Added:
files_to_remove.append(sync.path)
modified_files.add(sync.path)
Expand Down
4 changes: 3 additions & 1 deletion src/codegen/sdk/codebase/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,14 @@

def post_init_validation(codebase: CodebaseType) -> PostInitValidationStatus:
"""Post codebase._init_graph verifies that the built graph is valid."""
from codegen.sdk.codebase.codebase_graph import GLOBAL_FILE_IGNORE_LIST

# Verify the graph has nodes
if len(codebase.G.nodes) == 0:
return PostInitValidationStatus.NO_NODES

# Verify the graph has the same number of files as there are in the repo
if len(codebase.files) != len(codebase.op.list_files(codebase.G.projects[0].subdirectories, extensions=codebase.G.extensions)):
if len(codebase.files) != len(list(codebase.op.iter_files(codebase.G.projects[0].subdirectories, extensions=codebase.G.extensions, ignore_list=GLOBAL_FILE_IGNORE_LIST))):

Check failure on line 40 in src/codegen/sdk/codebase/validation.py

View workflow job for this annotation

GitHub Actions / mypy

error: Argument 1 to "len" has incompatible type overloaded function; expected "Sized" [arg-type]
return PostInitValidationStatus.MISSING_FILES

# Verify import resolution
Expand Down Expand Up @@ -68,7 +70,7 @@
if not codebase.G.config.feature_flags.track_graph:
msg = "Can only be called with track_graph=true"
raise NotImplementedError(msg)
return len(dict.fromkeys(codebase.G.old_graph.nodes())) == len(dict.fromkeys(codebase.G.nodes)) and len(dict.fromkeys(codebase.G.old_graph.weighted_edge_list())) == len(

Check failure on line 73 in src/codegen/sdk/codebase/validation.py

View workflow job for this annotation

GitHub Actions / mypy

error: Cannot determine type of "old_graph" [has-type]
dict.fromkeys(codebase.G.edges)
)

Expand Down
34 changes: 18 additions & 16 deletions src/codegen/sdk/core/detached_symbols/function_call.py
Original file line number Diff line number Diff line change
Expand Up @@ -424,14 +424,15 @@
from codegen.sdk.core.interfaces.callable import Callable

result = []
for resolution in self.get_name().resolved_type_frames:
top_node = resolution.top.node
if isinstance(top_node, Callable):
if isinstance(top_node, Class):
if constructor := top_node.constructor:
result.append(resolution.with_new_base(constructor, direct=True))
continue
result.append(resolution)
if self.get_name():
for resolution in self.get_name().resolved_type_frames:
top_node = resolution.top.node
if isinstance(top_node, Callable):
if isinstance(top_node, Class):
if constructor := top_node.constructor:
result.append(resolution.with_new_base(constructor, direct=True))
continue
result.append(resolution)
return result

@cached_property
Expand Down Expand Up @@ -546,15 +547,16 @@
if desc := self.child_by_field_name("type_arguments"):
desc._compute_dependencies(UsageKind.GENERIC, dest)
match = self.get_name()
if len(self.function_definition_frames) > 0:
if isinstance(match, ChainedAttribute):
match.object._compute_dependencies(usage_type, dest)
if isinstance(match, FunctionCall):
if match:
if len(self.function_definition_frames) > 0:
if isinstance(match, ChainedAttribute):
match.object._compute_dependencies(usage_type, dest)
if isinstance(match, FunctionCall):
match._compute_dependencies(usage_type, dest)

Check warning on line 555 in src/codegen/sdk/core/detached_symbols/function_call.py

View check run for this annotation

Codecov / codecov/patch

src/codegen/sdk/core/detached_symbols/function_call.py#L555

Added line #L555 was not covered by tests
for definition in self.function_definition_frames:
definition.add_usage(match=self, dest=dest, usage_type=usage_type, G=self.G)
else:
match._compute_dependencies(usage_type, dest)
for definition in self.function_definition_frames:
definition.add_usage(match=self, dest=dest, usage_type=usage_type, G=self.G)
else:
match._compute_dependencies(usage_type, dest)

@property
@reader
Expand Down
5 changes: 5 additions & 0 deletions src/codegen/sdk/core/expressions/chained_attribute.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,17 @@
@noapidoc
@override
def _resolved_types(self) -> Generator[ResolutionStack[Self], None, None]:
from codegen.sdk.typescript.namespace import TSNamespace

if not self.G.config.feature_flags.method_usages:
return
if res := self.file.valid_import_names.get(self.full_name, None):
# Module imports
yield from self.with_resolution_frame(res)
return
# HACK: This is a hack to skip the resolved types for namespaces
if isinstance(self.object, TSNamespace):
return

Check warning on line 102 in src/codegen/sdk/core/expressions/chained_attribute.py

View check run for this annotation

Codecov / codecov/patch

src/codegen/sdk/core/expressions/chained_attribute.py#L102

Added line #L102 was not covered by tests
for resolved_type in self.object.resolved_type_frames:
top = resolved_type.top
if not isinstance(top.node, HasAttribute):
Expand Down
6 changes: 5 additions & 1 deletion src/codegen/sdk/typescript/ts_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,11 @@
cleaned_relative_path = relative_path.replace("*", "").rstrip("/").replace("//", "/")
if self._self_base_url:
cleaned_relative_path = os.path.join(self._self_base_url, cleaned_relative_path)
formatted_relative_path = str(self.config_file.G.to_relative(self._relative_to_absolute_directory_path(cleaned_relative_path)))
formatted_absolute_path = self._relative_to_absolute_directory_path(cleaned_relative_path)
formatted_relative_path = str(self.config_file.G.to_relative(formatted_absolute_path))
# Fix absolute path if its base
if formatted_relative_path == ".":
formatted_relative_path = ""

Check warning on line 170 in src/codegen/sdk/typescript/ts_config.py

View check run for this annotation

Codecov / codecov/patch

src/codegen/sdk/typescript/ts_config.py#L170

Added line #L170 was not covered by tests
formatted_relative_paths.append(formatted_relative_path)
self_path_import_aliases[formatted_pattern] = formatted_relative_paths
self._path_import_aliases = {**base_path_import_aliases, **self_path_import_aliases}
Expand Down
3 changes: 1 addition & 2 deletions tests/integration/codemod/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,7 @@ def pytest_generate_tests(metafunc: Metafunc) -> None:
scope="session",
)
case "test_codemods_parse":
excluded_repos = {"typeshed", "plone", "papermark", "vscode"} # TODO(CG-10655): fix these reps
to_test = {name: repo for name, repo in repos.items() if name not in excluded_repos}
to_test = {name: repo for name, repo in repos.items()}
metafunc.parametrize(
"repo",
[pytest.param(repo, marks=pytest.mark.xdist_group(repo.name)) for repo in to_test.values()],
Expand Down
8 changes: 0 additions & 8 deletions tests/integration/codemod/repos/open_source/plone.json

This file was deleted.

7 changes: 0 additions & 7 deletions tests/integration/codemod/repos/open_source/typeshed.json

This file was deleted.

2 changes: 1 addition & 1 deletion tests/integration/codemod/repos/open_source/vscode.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "vscode",
"commit": "9c79e7322af656155bbc9b64341334d3a8269bc8",
"commit": "32a41e158d04c9777522dc567574f2a74b8f2bf9",
"url": "https://github.com/microsoft/vscode",
"language": "TYPESCRIPT",
"size": "large",
Expand Down