Skip to content

🟠 HIGH: Inconsistent case-insensitive symbol lookup #42

@michaeldistel

Description

@michaeldistel

Problem

IEC 61131-3 is case-insensitive, but implementation is inconsistent:

  • Some lookups use toLowerCase() normalization
  • Others use exact match first, then fallback
  • normalizedName field sometimes not set

Impact

Go to definition fails when symbol casing differs:

VAR 
    myTimer : TON; 
END_VAR

MyTimer.Q := TRUE;  // <-- Won't find definition
MYTIMER(IN := TRUE); // <-- May or may not work

Code Locations

  • workspace-indexer.ts - Uses toLowerCase() normalization
  • definition-provider.ts - Exact match first, then fallback
  • ast-parser.ts lines 217-218 - normalizedName sometimes not set

Fix Required

Standardize case handling across all providers:

// 1. Always set normalizedName in AST parser
symbol.normalizedName = symbol.name.toLowerCase();

// 2. All lookups use normalized names
const lookup = symbolMap.get(identifier.toLowerCase());

// 3. Display original case to user
// 4. Store both original and normalized

Files Affected

  • src/server/ast-parser.ts - Always normalize
  • src/server/workspace-indexer.ts - Use normalized keys
  • src/server/providers/definition-provider.ts - Consistent lookup
  • src/server/providers/completion-provider.ts - Consistent lookup
  • src/server/providers/hover-provider.ts - Consistent lookup
  • src/server/providers/member-access-provider.ts - Consistent lookup

Acceptance Criteria

  • All symbols have normalizedName set
  • All lookups use normalized comparison
  • Original case preserved for display
  • Tests with mixed case scenarios
  • myTimer, MyTimer, MYTIMER all resolve correctly
  • Performance not degraded

Priority

HIGH - Core language feature (case insensitivity) broken

Related

  • IEC 61131-3 specification compliance
  • Symbol resolution
  • All LSP providers

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority: HighbugSomething isn't workinglspLanguage Server Protocol relatedtechnical-debtCode quality and architectural issues

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions