Skip to content

feat(parsers): extract access modifiers and decorators via highlights.scm#566

Open
ChetanyaRathi wants to merge 12 commits into
vitali87:mainfrom
ChetanyaRathi:feat/525-highlights-modifiers-decorators
Open

feat(parsers): extract access modifiers and decorators via highlights.scm#566
ChetanyaRathi wants to merge 12 commits into
vitali87:mainfrom
ChetanyaRathi:feat/525-highlights-modifiers-decorators

Conversation

@ChetanyaRathi

@ChetanyaRathi ChetanyaRathi commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Advances #525 and #521.

Generalizes access-modifier and decorator extraction from Java-only to a single
shared, highlights.scm-driven path for all languages.

  • New shared extract_modifiers_and_decorators in parsers/utils.py, loaded via
    parser_loader.py; populates modifiers: list[str] and decorators: list[str] on
    Function/Method/Class nodes (empty list when absent).
  • Refactored the per-language handlers (java, js_ts, php, rust, python) onto the
    shared path, removing the bespoke logic; kept the handler Protocol consistent.
  • Added per-language extraction tests.

Testing: full unit suite green on CI targets; ruff check + ruff format clean;
ty check codebase_rag (--exclude tests) clean. Local Windows shows only
OS-specific failures (path separators, symlink privileges, cp1252 encoding,
libclang) that pass on Linux CI.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors decorator and modifier extraction across multiple languages by replacing language-specific handler methods with a unified utility that leverages tree-sitter highlights queries. It also updates the schema to store modifiers for classes, functions, and methods. The review feedback highlights three key issues: a bug in query loading where a module import failure incorrectly skips fallback queries, noisy modifier extraction that captures definition keywords like def or class, and a parsing failure in _decorator_tail_names when handling decorators with arguments.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +236 to +257
try:
module_name = f"{cs.TREE_SITTER_MODULE_PREFIX}{lang_name.replace('-', '_')}"
module = importlib.import_module(module_name)

query_str = ""
if hasattr(module, "HIGHLIGHTS_QUERY"):
query_str = module.HIGHLIGHTS_QUERY

fallback_path = (
Path(__file__).parent / "queries" / "highlights" / f"{lang_name}.scm"
)
if fallback_path.exists():
custom_queries = fallback_path.read_text(encoding="utf-8")
query_str = (
query_str + "\n" + custom_queries if query_str else custom_queries
)

if query_str:
return Query(language, query_str)
except Exception as e:
logger.debug(f"Failed to load highlights query for {lang_name}: {e}")
return None

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

If the tree-sitter module import fails (e.g., ModuleNotFoundError or ImportError), the entire try block is aborted, which completely skips loading the fallback highlights query from fallback_path. This is a major bug because fallback queries should still be loaded even if the module import fails (or if the module is loaded from a submodule where the bindings path is no longer in sys.path). Separating the module import/query extraction from the fallback path loading using separate try-except blocks is much more robust and correct.

    query_str = ""
    try:
        module_name = f"{cs.TREE_SITTER_MODULE_PREFIX}{lang_name.replace('-', '_')}"
        module = importlib.import_module(module_name)
        if hasattr(module, "HIGHLIGHTS_QUERY"):
            query_str = module.HIGHLIGHTS_QUERY
    except Exception as e:
        logger.debug(f"Failed to import tree-sitter module for {lang_name}: {e}")

    try:
        fallback_path = (
            Path(__file__).parent / "queries" / "highlights" / f"{lang_name}.scm"
        )
        if fallback_path.exists():
            custom_queries = fallback_path.read_text(encoding="utf-8")
            query_str = (
                query_str + "\n" + custom_queries if query_str else custom_queries
            )

        if query_str:
            return Query(language, query_str)
    except Exception as e:
        logger.debug(f"Failed to load highlights query for {lang_name}: {e}")
    return None

Comment thread codebase_rag/parsers/utils.py
Comment on lines 155 to 159
def _decorator_tail_names(decorators: list[str]) -> set[str]:
return {
decorator.lstrip(cs.DECORATOR_AT).split(cs.SEPARATOR_DOT)[-1]
decorator.lstrip("@#[]() ").split(cs.SEPARATOR_DOT)[-1].rstrip(")]")
for decorator in decorators
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The code decorator.lstrip("@#[]() ").split(cs.SEPARATOR_DOT)[-1].rstrip(")]") fails to correctly extract the bare name of decorators with arguments (e.g., @cached_property(ttl=3600) or @Component({selector: 'app-root'})). For @cached_property(ttl=3600), it returns cached_property(ttl=3600, which fails to match cached_property in cs.PROPERTY_DECORATORS. We should split on ( first to strip any arguments before extracting the tail name.

Suggested change
def _decorator_tail_names(decorators: list[str]) -> set[str]:
return {
decorator.lstrip(cs.DECORATOR_AT).split(cs.SEPARATOR_DOT)[-1]
decorator.lstrip("@#[]() ").split(cs.SEPARATOR_DOT)[-1].rstrip(")]")
for decorator in decorators
}
def _decorator_tail_names(decorators: list[str]) -> set[str]:
return {
decorator.lstrip("@#[]() ").split("(")[0].split(cs.SEPARATOR_DOT)[-1].rstrip(")] ")
for decorator in decorators
}
References
  1. When parsing decorators, annotations, or attributes, extract the full text including arguments, not just the name. This preserves crucial semantic information (e.g., arguments in @RequestMapping(value="/api") or #[derive(Debug)]) for RAG queries and ensures consistency across all supported languages (Python, Java, Rust, TypeScript).

@greptile-apps

greptile-apps Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR generalizes access-modifier and decorator extraction from a per-language extract_decorators method on each handler into a single extract_modifiers_and_decorators helper in parsers/utils.py, driven by per-language highlights.scm queries loaded by parser_loader.py. It also adds a modifiers field alongside the existing decorators field on Function/Method/Class graph nodes, and fixes the TSX gap by remapping TSX to the TypeScript highlights query.

  • New _create_highlights_query in parser_loader.py tries the installed tree_sitter_* package first, then falls back to the checked-in .scm file; TSX correctly reuses typescript.scm via query_lang_name aliasing.
  • extract_modifiers_and_decorators in parsers/utils.py promotes the node to its decorated_definition/export_statement parent for Python/TS, walks preceding Rust attribute_item siblings, and queries only up to the body start so body tokens are excluded.
  • All per-language handler extract_decorators overrides are removed; LanguageQueries gains a highlights slot and NODE_SCHEMAS gains the modifiers field.

Confidence Score: 4/5

The core extraction logic and the TSX fix are sound, but the non-combined parse path in _ingest_all_functions crashes at runtime before any function is registered.

_ingest_all_functions only assigns lang_queries inside the if combined_captures is not None branch. The else branch, the normal single-file parse path, never sets it, yet all three inner helpers now unconditionally consume it as a required argument. Any file processed through the non-combined code path will raise UnboundLocalError before a single function node is registered in the graph.

codebase_rag/parsers/function_ingest.py — the _ingest_all_functions else-branch needs lang_queries = queries[language] after unpacking the get_function_captures result.

Important Files Changed

Filename Overview
codebase_rag/parsers/function_ingest.py Passes lang_queries to all inner helpers and deferred entries, but leaves it unbound in the else-branch of _ingest_all_functions, so any non-combined parse invocation raises UnboundLocalError at runtime.
codebase_rag/parser_loader.py Adds _create_highlights_query; correctly remaps TSX to TS via query_lang_name, and the fallback .scm read is now in a separate try/except so a module-import failure doesn't suppress the local file path.
codebase_rag/parsers/utils.py New extract_modifiers_and_decorators correctly walks Rust sibling attribute_item nodes and handles Python decorated_definition / TS export_statement parent promotion; _decorator_tail_names introduces three raw string literals that should be constants.
codebase_rag/queries/highlights/typescript.scm Captures decorator and all TS/JS access modifier keywords; now also consumed by TSX via the query_lang_name remap in the loader.
codebase_rag/queries/highlights/php.scm Captures only attribute_group (not nested attribute), fixing the previously reported double-capture; tests confirm one group = one decorator entry.
codebase_rag/tests/test_modifiers_and_decorators.py Good coverage of per-language extraction, TSX regression test, fallback-query load paths, and PHP dedup.
codebase_rag/parsers/class_ingest/mixin.py Drops the abstract _extract_decorators and delegates to the shared extract_modifiers_and_decorators; passes lang_queries to both ingest_method call sites.
codebase_rag/constants.py Adds EXCLUDED_KEYWORDS, KEY_MODIFIERS, QUERY_HIGHLIGHTS, and the four capture-name constants needed by the shared extractor.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[AST node] --> B{parent type?}
    B -->|decorated_definition / export_statement| C[target_node = parent]
    B -->|other| D[target_node = node]
    C --> E[sibling walk]
    D --> E
    E -->|prev sibling is attribute_item Rust| F[prepend sibling to query_nodes]
    E -->|prev sibling is decorator on method_definition TS| F
    F --> E
    E -->|no more matching siblings| G[for each query_node]
    G --> H{query_node == target_node?}
    H -->|yes| I[set_byte_range: start to body_start]
    H -->|no - sibling node| J[set_byte_range: full sibling]
    I --> K[run highlights query]
    J --> K
    K -->|keyword.modifier / keyword| L[modifiers list]
    K -->|function.decorator / attribute.*| M[decorators list]
    L --> N[return modifiers, decorators]
    M --> N
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[AST node] --> B{parent type?}
    B -->|decorated_definition / export_statement| C[target_node = parent]
    B -->|other| D[target_node = node]
    C --> E[sibling walk]
    D --> E
    E -->|prev sibling is attribute_item Rust| F[prepend sibling to query_nodes]
    E -->|prev sibling is decorator on method_definition TS| F
    F --> E
    E -->|no more matching siblings| G[for each query_node]
    G --> H{query_node == target_node?}
    H -->|yes| I[set_byte_range: start to body_start]
    H -->|no - sibling node| J[set_byte_range: full sibling]
    I --> K[run highlights query]
    J --> K
    K -->|keyword.modifier / keyword| L[modifiers list]
    K -->|function.decorator / attribute.*| M[decorators list]
    L --> N[return modifiers, decorators]
    M --> N
Loading

Comments Outside Diff (1)

  1. codebase_rag/parsers/function_ingest.py, line 98-116 (link)

    P1 lang_queries still unbound on the non-combined path

    When combined_captures is None, the else branch sets only lang_config and captures from get_function_captures, but never assigns lang_queries. Every branch below that — _handle_cpp_out_of_class_method, _defer_go_receiver_method, and _register_function — now receives lang_queries as a required (non-optional) argument, so any file that hits the non-combined code path will raise UnboundLocalError at runtime regardless of language.

    The fix is to add lang_queries = queries[language] in the else branch after unpacking the result, mirroring the if combined_captures is not None branch.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: codebase_rag/parsers/function_ingest.py
    Line: 98-116
    
    Comment:
    **`lang_queries` still unbound on the non-combined path**
    
    When `combined_captures is None`, the `else` branch sets only `lang_config` and `captures` from `get_function_captures`, but never assigns `lang_queries`. Every branch below that — `_handle_cpp_out_of_class_method`, `_defer_go_receiver_method`, and `_register_function` — now receives `lang_queries` as a required (non-optional) argument, so any file that hits the non-combined code path will raise `UnboundLocalError` at runtime regardless of language.
    
    The fix is to add `lang_queries = queries[language]` in the `else` branch after unpacking the result, mirroring the `if combined_captures is not None` branch.
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 1
codebase_rag/parsers/function_ingest.py:98-116
**`lang_queries` still unbound on the non-combined path**

When `combined_captures is None`, the `else` branch sets only `lang_config` and `captures` from `get_function_captures`, but never assigns `lang_queries`. Every branch below that — `_handle_cpp_out_of_class_method`, `_defer_go_receiver_method`, and `_register_function` — now receives `lang_queries` as a required (non-optional) argument, so any file that hits the non-combined code path will raise `UnboundLocalError` at runtime regardless of language.

The fix is to add `lang_queries = queries[language]` in the `else` branch after unpacking the result, mirroring the `if combined_captures is not None` branch.

Reviews (7): Last reviewed commit: "fix(parsers): load TSX highlights by reu..." | Re-trigger Greptile

Comment thread codebase_rag/parsers/utils.py Outdated
Comment thread codebase_rag/parser_loader.py Outdated
@ChetanyaRathi ChetanyaRathi changed the title Feat/525 highlights modifiers decorators feat(parsers): extract access modifiers and decorators via highlights.scm Jul 1, 2026
@ChetanyaRathi

Copy link
Copy Markdown
Contributor Author

Heads up: CI didn't run here — all jobs show "The job was not started because your account is locked due to a billing issue," which looks like a repo-level Actions billing problem rather than anything in this PR. Locally the full unit suite passes (only Windows-specific path/symlink/encoding tests fail, which pass on Linux CI), ruff check + format are clean, and ty check codebase_rag is clean. Happy to re-run once Actions is available.

@codecov-commenter

codecov-commenter commented Jul 2, 2026

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 99.00000% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...odebase_rag/tests/test_modifiers_and_decorators.py 98.16% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

@vitali87 vitali87 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few blockers before this can merge:

  1. Rebase — 248 commits behind main, which has since reworked the parser surface this touches. Currently conflicting; needs a fresh diff.
  2. Hardcoded stringsextract_modifiers_and_decorators in parsers/utils.py hardcodes strings that already have constants:
    "decorated_definition"cs.TS_PY_DECORATED_DEFINITION,
    "export_statement"cs.TS_EXPORT_STATEMENT, "attribute_item"cs.TS_RS_ATTRIBUTE_ITEM, plus
    "body"/"highlights"/the capture names/_EXCLUDED_KEYWORDS. Move these to constants.py.
  3. Scope#525 wants 12 languages; this covers 6 (java, js, ts, php, python, rust). Change Closes to Advances #525, or add C/C++/Go/Lua/Scala/C#.
  4. CI — Type Check fails on clang.cindex (stale-base artifact, should clear on rebase); Windows tests red (green on current main — confirm after rebase).

Re-review once rebased and constants are pulled out.

@ChetanyaRathi ChetanyaRathi force-pushed the feat/525-highlights-modifiers-decorators branch from 9da44d5 to 7bdd479 Compare July 6, 2026 17:41
@ChetanyaRathi

Copy link
Copy Markdown
Contributor Author

Rebased onto main (v0.0.237), conflicts resolved against the reworked parser surface. Moved the hardcoded tree-sitter strings (decorated_definition, export_statement, attribute_item, body, highlights key, capture names, _EXCLUDED_KEYWORDS) into constants.py. Changed "Closes" to "Advances #525" since this covers 6 of the 12 languages. Local: 4315 passed, ruff check + format clean, ty check codebase_rag clean; only the 2 Windows symlink-privilege tests fail locally (pass on Linux CI).

@ChetanyaRathi

Copy link
Copy Markdown
Contributor Author

Post-rebase CI update: Lint and Type Check are green (the clang.cindex failure cleared on rebase, as expected). The only remaining red is windows-latest on two broken-symlink tests (test_hash_with_bytes_returns_none_for_broken_symlink and test_broken_symlink_does_not_crash_indexing), failing with WinError 1314 "A required privilege is not held" — that's Windows needing elevated privileges to create symlinks, not related to this PR. My diff doesn't touch test_graph_updater_incremental.py, and both pass on ubuntu and macOS. Happy to skip/guard them on unprivileged Windows if you'd like, but that seems out of scope here.

@vitali87

vitali87 commented Jul 6, 2026

Copy link
Copy Markdown
Owner

@greptile-apps

Comment thread codebase_rag/queries/highlights/java.scm
@vitali87

vitali87 commented Jul 6, 2026

Copy link
Copy Markdown
Owner

@ChetanyaRathi confirmed one live correctness bug still on the rebased head (7bdd479): TypeScript method decorators are not populated. Greptile's outstanding P1 reproduces.

Ran the shared extractor directly against the loaded parsers:

TS  class Foo { @methodDec decoratedMethod(): void {} }  -> decorators=[]              # BUG
JS  class Foo { @methodDec decoratedMethod() {} }        -> decorators=['@methodDec']   # ok
TS  @classDec class Foo {}                               -> decorators=['@classDec']    # ok

Cause: in the TypeScript grammar the decorator on a method sits outside the method_definition byte span, and it is neither a decorated_definition/export_statement parent (the parent-hop) nor a Rust attribute_item sibling (the prev-sibling walk). So the range method_definition.start_byte .. header_end_byte never sees it. JS methods and TS classes work; only TS methods drop.

Fix: extend the extractor to pick up a preceding decorator sibling for the TS/JS method_definition case (mirror the Rust attribute-item sibling walk), then add a regression test asserting the TS decorated method yields decorators=['@methodDec'].

Separately, the modifier tests are all negative assertions ("def" not in modifiers); none asserts a real modifier is present, so a regression that empties modifiers would pass CI. Worth one positive assertion (e.g. Java public/static).

@ChetanyaRathi ChetanyaRathi force-pushed the feat/525-highlights-modifiers-decorators branch from 6589ab7 to e1865be Compare July 7, 2026 00:23
@ChetanyaRathi

Copy link
Copy Markdown
Contributor Author

Fixed all three:

  • TS method decorators: extended the extractor to walk the preceding decorator sibling for method_definition (mirroring the Rust attribute walk) — class Foo { @methodDec decoratedMethod(): void {} } now yields ['@methodDec']. Regression test added; TS classes / JS methods still pass.
  • Fallback .scm: added @keyword.modifier captures to all six queries/highlights/*.scm so modifiers populate on the package-unavailable path, not just decorators.
  • Tests: added positive assertions (test_typescript_decorated_method, test_java_modifiers_present) alongside the negatives.
    Rebased onto latest main (v0.0.240); uv.lock conflict resolved.

@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@greptile-apps

@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

Heads up: CI didn't run here — all jobs show "The job was not started because your account is locked due to a billing issue," which looks like a repo-level Actions billing problem rather than anything in this PR. Locally the full unit suite passes (only Windows-specific path/symlink/encoding tests fail, which pass on Linux CI), ruff check + format are clean, and ty check codebase_rag is clean. Happy to re-run once Actions is available.

All sorted already.

@vitali87 vitali87 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Almost there, can you please check what greptile tells about potential failure point? @ChetanyaRathi

Bot added 10 commits July 7, 2026 12:43
…ghlights

- Append custom fallback decorator highlights for languages missing them in upstream tree-sitter packages.

- Expand modifier extraction to check wrapper nodes (like decorated_definition).

- Remove obsolete decorator extraction tests.
…nition keywords, strip decorator args, capture Rust sibling attributes
…fier captures to fallback highlights; add positive modifier/decorator tests
@ChetanyaRathi ChetanyaRathi force-pushed the feat/525-highlights-modifiers-decorators branch from 77a6b85 to 215d7b9 Compare July 7, 2026 17:23
@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@greptile-apps

Comment thread codebase_rag/queries/highlights/php.scm Outdated
@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@ChetanyaRathi is this a big deal? Can you check please?
"""
One PHP query issue needs attention before merging because it can duplicate attribute decorators in graph properties.

The change is focused and covered by tests, but the shared highlights path introduces an observable extraction regression for PHP attributes.
"""

@ChetanyaRathi

Copy link
Copy Markdown
Contributor Author

Good catch, checked it. It wasn't a crash, but it was a real bug — the PHP query was capturing the attribute twice, so #[Route('/x')] showed up as two decorators instead of one. Fixed it to capture only once, and added tests to confirm one attribute = one decorator (plus a test for multiple attributes). Pushed in a1d45a4. Only red check left is the flaky windows-py3.13 symlink test, which passes everywhere else.

@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@greptile-apps

@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

Good catch, checked it. It wasn't a crash, but it was a real bug — the PHP query was capturing the attribute twice, so #[Route('/x')] showed up as two decorators instead of one. Fixed it to capture only once, and added tests to confirm one attribute = one decorator (plus a test for multiple attributes). Pushed in a1d45a4. Only red check left is the flaky windows-py3.13 symlink test, which passes everywhere else.

Yeah, I know about the windows flaky test.

@ChetanyaRathi

Copy link
Copy Markdown
Contributor Author

The only thing left is the uv.lock conflict, and it keeps re-conflicting on the version line because main is releasing several times a day (245 → 249 while I was rebasing). The actual code merges cleanly — GitHub shows "changes can be cleanly merged." Rather than chase another rebase that'll be stale again in an hour, could you take main's uv.lock when you merge? It regenerates deterministically from pyproject.toml, so there's no real content to resolve. All the review items are addressed (TS method decorators, fallback modifier captures, positive tests, function_ingest fix, PHP attribute dedup, constants, scope), and everything's green except the flaky windows-py3.13 symlink test.

@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

The only thing left is the uv.lock conflict, and it keeps re-conflicting on the version line because main is releasing several times a day (245 → 249 while I was rebasing). The actual code merges cleanly — GitHub shows "changes can be cleanly merged." Rather than chase another rebase that'll be stale again in an hour, could you take main's uv.lock when you merge? It regenerates deterministically from pyproject.toml, so there's no real content to resolve. All the review items are addressed (TS method decorators, fallback modifier captures, positive tests, function_ingest fix, PHP attribute dedup, constants, scope), and everything's green except the flaky windows-py3.13 symlink test.

Don't worry about uv.lock conflict, I will fix it when all is correct.

@vitali87

vitali87 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@ChetanyaRathi I tend ot merge PRs when they clear all greptile (5/5) and gemini comments. When you push a change, please invoke greptile with @greptile-apps to get your updates evaluated again in-place. This means that the greptile is adjusting its score on its first message. Right now it is stable 3/5 with potential issues. It used to be 4/5 at some point but since then we went down.

The resolution of the issues is two way:

  1. You either agree with the suggestion and send an update and re-trigger greptile
  2. You push back with a comment and re-trigger the greptile (you can also pass optional mesage when re-triggering to make your poiint).

Comment thread codebase_rag/parser_loader.py Outdated
@ChetanyaRathi

Copy link
Copy Markdown
Contributor Author

@greptile-apps Fixed the TSX highlights gap — TSX (.tsx) now reuses the TypeScript highlight query, so decorated TSX classes/functions get modifiers/decorators instead of None. Added a TSX regression test (test_tsx_decorated_method). Please re-review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants