Goal: Ensure the LSP protocol layer is rock-solid before building features on top.
- Fix HostSimple.exe critical issues (hardcoded paths, blocking constructor)
- Fix HostThreaded.exe critical issues (thread safety, resource cleanup)
- Update batch files (configurable paths, correct executable names)
- Updated
Binaries/UseServer.batto copydwsc.exeto a configurable destination (arg,DWSC_VSCODE_BIN, or defaultClients/VSCode/bin/dwsc.exe). - Updated
Binaries/UseStreamServer.batto delegate toUseServer.bat(legacy StreamServer deprecated for VS Code usage).
- Updated
- Add PowerShell variants for Windows
- Added
Binaries/UseServer.ps1with the same resolution order and messages as the batch script. - Added
Binaries/UseStreamServer.ps1delegating toUseServer.ps1.
- Added
- Create proper LSP test host with message parsing and validation
- Added unified tester
Tools/lsp_tester.pysupporting stdio and TCP modes, validating initialize → shutdown lifecycle with logging. - Existing scripts (
test_stdio_client.py,test_tcp_client.py) remain for focused transport tests. - Note:
HostSimple.exe/HostThreaded.exeare legacy binaries without source in this repo; recommend deprecation or separate maintenance repo if fixes are required.
- Added unified tester
Status: ✅ Core LSP functionality tested and verified
Completed:
- Build
Server/dwsc.dpr→Binaries/dwsc.exe - Test basic LSP message exchange (initialize/shutdown lifecycle)
- ✅ Stdio transport: Tests/test_stdio_client.py - PASSING
- ✅ TCP transport: Tests/test_tcp_client.py - PASSING
- Both transports respond <1 second, full lifecycle working
- Created diagnostics test framework: Tests/test_diagnostics.py
Deferred to Phase 1+ (not blockers):
- Record session with lsp-devtools (optional, for advanced debugging)
- Run pytest-lsp tests (when more features implemented)
- Expand test corpus (needs Phase 1 features)
- Add message handling tests (nice to have)
- Add diagnostic tests (needs program compilation)
Test Results: See PHASE0_TESTING_SUMMARY.md
The following test scripts have been created to validate the transport layer once issue 0.0 is fixed:
-
test_tcp_client.py - Tests TCP transport on port 8765
- Sends LSP initialize request over TCP socket
- Validates Content-Length framing
- Tests full initialize → shutdown → exit lifecycle
- Usage:
python test_tcp_client.py(requires server running with-tcp=8765)
-
test_stdio_client.py - Tests stdio transport
- Spawns server process with stdin/stdout pipes
- Sends LSP initialize request via stdio
- Validates message framing
- Tests full LSP lifecycle
- Usage:
python test_stdio_client.py
-
test_init_request.json - Sample initialize request JSON
- Raw JSON for manual testing
- Can be used with lsp-devtools or other LSP testing tools
Goal: Make document tracking incremental, reliable, and fast.
Status: ✅ Full TextDocumentSync implementation completed with incremental synchronization, debounced diagnostics, and LSP compliance
Completed:
-
textDocument/didOpen- Store full document text in
TdwsTextDocumentItemList - Assign initial version number
- Trigger initial parse and diagnostics
- Add to workspace index
- Store full document text in
-
textDocument/didChange(incremental mode)- Support both full and incremental changes via
ApplyTextEditfunction - Update document version on each change
- Apply incremental edits to in-memory text
- Invalidate affected AST nodes/symbols
- Debounce diagnostics (500ms after last change using
GetTickCount)
- Support both full and incremental changes via
-
textDocument/didSave- Optionally include text (if client sends it)
- Trigger full re-compilation
- Update diagnostics
-
textDocument/didClose- Remove from in-memory cache
- Clear diagnostics for that URI
- Remove from workspace index (unless part of workspace folder)
Technical Implementation:
- Added
ApplyTextEditfunction indwsc.Utils.pasfor efficient incremental text modifications - Implemented time-based diagnostics debouncing using Windows
GetTickCountAPI (500ms delay) - Enhanced
TDWScriptLanguageServerwith complete event handlers for all TextDocumentSync events - Added
Windowsunit to uses clause forGetTickCountfunction - Declared event handlers
OnIncludeEventHandlerandOnNeedUnitEventHandlerin private section - Integrated debouncing into main message processing loop in
Inputmethod
Test Results: Server compiles successfully (dcc32 dwsc.dpr exits with code 0)
- Create
TDocumentModelclass- Store URI, version, text content
- Store parsed AST (link to
TdwsProgramor equivalent) - Store symbol table for the document
- Track dirty state (changed since last compile)
- Implement incremental update logic
- Apply range edits to text
- Mark affected line ranges as dirty
- Re-parse dirty sections (or full document if complex)
Status: ✅ Full workspace indexing implementation completed
Completed:
- Implement background indexer service
- Index all
.dwsand.pasfiles in workspace on startup - Build global symbol table (types, functions, variables, units)
- Track dependencies via
usesclauses - Support incremental re-indexing on file changes
- Index all
- Implement
workspace/didChangeWatchedFiles- Watch
**/*.{dws,pas}via client file watcher - Re-index changed/created files
- Remove deleted files from index
- Watch
- Symbol table structure
- Map symbol names → locations (URI + range)
- Track symbol kinds (class, function, variable, etc.)
- Support cross-file references
- Index doc comments for hover tooltips (deferred to Phase 2)
Implementation Files:
- Created
Server/dwsc.Classes.WorkspaceIndex.paswith full indexing infrastructure - Enhanced
Server/dwsc.LanguageServer.paswith workspace index integration - Added
Tests/test_workspace_indexing.pyfor validation
- Parse
dwsc.compilerSettings.libraryPathsfrom configuration - Implement unit resolution
- Search for
.pasfiles in library paths when resolvinguses - Cache resolved paths
- Search for
- Support
dwsc.compilerSettings.conditionalDefines- Track active defines and recompile on change
- Show diagnostics for active branches only (via compiler conditionals)
Implementation notes:
- Added library path handling and unit path cache in
TDWScriptLanguageServer. - Resolved units via
OnNeedUnit: searches open docs first, then.pasin configured paths. - Library paths refresh on initialize and
workspace/didChangeConfiguration. - Defines applied in
ConfigureCompiler; on change, document models are invalidated and diagnostics are refreshed by recompiling open documents.
Goal: Make current features work correctly and reliably.
- Fix token range computation
- Implement
GetTokenRangeAtPosition()indwsc.Utils.pas - Expand left/right to word boundaries
- Handle operators, keywords, punctuation correctly
- Implement
- Extract symbol information from AST/index
- Type signature
- Doc comments (if available in DWScript)
- Value for constants
- Return
HoverwithMarkedStringorMarkupContent- Use Markdown formatting
- Include code fences for type signatures
- Handle edge cases
- Hover in comments → return
null - Hover in strings → return
null - Hover over whitespace → return
null
- Hover in comments → return
- Use workspace index to resolve symbols
- Support cross-file navigation
- Follow
usesclauses - Resolve units via search paths
- Follow
- Return
LocationorLocation[]for overloads - Handle built-in symbols gracefully (return
nullor link to docs)
- Use workspace index to find all references
- Support
includeDeclarationparameter - Filter out comments and string literals
- Return sorted
Location[]
- Extract symbol hierarchy from AST
- Return
DocumentSymbol[](hierarchical, LSP 3.10+)- Support nested symbols (classes → methods → local vars)
- Assign correct
SymbolKindvalues - Include full range and selection range
- Fallback to
SymbolInformation[]for older clients
- Find all occurrences of symbol under cursor in current document
- Assign
DocumentHighlightKind(read vs. write) - Return
DocumentHighlight[]
- Add null checks for missing symbols
- Handle generated/synthetic AST nodes
- Test with conditional compilation blocks
- Test with incomplete/malformed code
Goal: Provide high-quality syntax highlighting for DWScript.
- Vendor the MIT-licensed Pascal TextMate grammar
- Source: https://marketplace.visualstudio.com/items?itemName=alefragnani.pascal
- Copy to
Clients/VSCode/syntaxes/dwscript.tmLanguage.json - Add clear license attribution in file header
- Extend grammar for DWScript-specific constructs
- Anonymous methods/procedures
- Attributes (e.g.,
[AttributeName]) - DWScript-specific keywords
- Generics syntax
- Class helpers
- Update
package.jsongrammar contribution- Already points to
./syntaxes/dwscript.tmLanguage.json - Ensure
scopeName: "source.dwscript"matches grammar
- Already points to
- Test with golden files
- Create
Test/Syntax/directory - Add diverse DWScript samples (classes, generics, attributes, etc.)
- Manually verify scopes in VS Code
- Create
- Create Node.js test suite for grammar
- Use
vscode-textmatelibrary - Load grammar and tokenize test files
- Assert expected scopes for key constructs
- Use
- Add to CI pipeline (Phase 6)
- Evaluate Tree-sitter Pascal grammar
- Source: https://github.com/Isopod/tree-sitter-pascal
- Test with DWScript samples
- Assess completeness
- If viable, integrate as alternative
- Add
tree-sitter-dwscriptbuild step - Wire into VS Code via
vscode-tree-sitterextension - Enables future semantic tokens support
- Add
Goal: Deliver a minimal-but-valuable set of LSP features, fully tested.
- Trigger characters:
.,:, whitespace (after keywords) - Completion sources
- Identifiers in scope (local vars, params, class members)
- Members after
.(record/class/object fields and methods) - Unit names in
usesclause - Keywords (if, then, begin, end, etc.)
- Snippets for common patterns (class, function, etc.)
- Return
CompletionListwithCompletionItem[]- Assign
CompletionItemKind(function, variable, class, etc.) - Provide
detail(type signature) - Provide
documentation(doc comments) - Support
insertTextvs.textEdit(usetextEditfor precision) - Sort by relevance (scope proximity, usage frequency)
- Assign
- Implement
completionItem/resolvefor expensive fields- Lazy-load documentation or additional details
- Trigger characters:
(,, - Find enclosing function call
- Retrieve function/method signatures from index
- Return
SignatureHelp-
signatures: array ofSignatureInformation -
activeSignature: index of current overload -
activeParameter: index of current parameter
-
- Support overloaded functions
- Include parameter documentation
- Map DWScript compiler errors to
Diagnostic[]- Parse compiler messages
- Extract line/column ranges
- Map severity (error, warning, hint)
- Include related information
- "Declared here" links for redeclaration errors
- Add diagnostic codes (if DWScript provides them)
- Support
DiagnosticRelatedInformation
- Query global symbol index
- Support fuzzy matching (e.g.,
FooBarmatchesFBaz) - Return
SymbolInformation[]sorted by relevance - Limit results to top N (e.g., 100) for performance
- Advertise only completed features
-
textDocumentSync: TextDocumentSyncKind.Incremental -
hoverProvider: true -
definitionProvider: true -
referencesProvider: true -
documentSymbolProvider: true -
documentHighlightProvider: true -
completionProvider: { triggerCharacters: ['.', ':'] } -
signatureHelpProvider: { triggerCharacters: ['(', ','] } -
workspaceSymbolProvider: true
-
- Do not advertise unimplemented features
Goal: Ensure reliability through comprehensive automated tests.
- Set up test framework
- Already using DUnit in
UnitTest/ - Ensure tests run headless in CI
- Already using DUnit in
- Test protocol class serialization
- All
TJsonClasssubclasses indwsc.Classes.*.pas - Round-trip: JSON → Object → JSON
- Test edge cases (null, missing fields, invalid types)
- All
- Test LSP message handling
- Mock client requests
- Assert responses match expectations
- Test initialize/shutdown lifecycle
- Test symbol resolution
- Single-file resolution
- Cross-file resolution via
uses - Scoping rules (local, class, global)
- Test compilation & diagnostics
- Parse valid programs → no diagnostics
- Parse programs with errors → correct diagnostics
- Test conditional compilation
- Test utilities
- URI normalization (
dwsc.Utils.pas) - Range math (overlap, contains, etc.)
- Token range extraction
- URI normalization (
- Expand existing tests in
UnitTest/TestLanguageServer.pas- Already has basic JSON and LSP tests
- Add tests for new features (completion, signature help, etc.)
- Set up pytest-lsp
- Install:
pip install pytest-lsp - Create
Tests/Integration/directory - Add
conftest.pywith server fixture@pytest_lsp.fixture(scope="session") async def dwscript_client(lsp_client): await lsp_client.initialize_session({ "rootUri": "file:///path/to/test/workspace", "capabilities": {...} }) yield lsp_client await lsp_client.shutdown_session()
- Install:
- Test LSP lifecycle
- Initialize → capabilities correct
- Shutdown → server exits cleanly
- Test document synchronization
- didOpen → diagnostics published
- didChange (incremental) → diagnostics updated
- didClose → diagnostics cleared
- Test language features end-to-end
- Hover → correct type and doc
- Definition → correct location
- References → all occurrences found
- Completion → relevant suggestions
- Signature help → correct overload
- Use golden test files from
Test/directory-
Test.dws,UnitAdd.dws,UnitSub.dws, etc.
-
- Run in CI (Phase 6)
- Set up VS Code extension test runner
- Use
@vscode/test-electron - Create
Clients/VSCode/src/test/directory - Add
runTest.tsto launch headless VS Code
- Use
- Test extension activation
- Open
.dwsfile → extension activates - Language server starts
- Open
- Test editor-level behaviors
- Outline view populates (document symbols)
- Go-to-definition jumps to correct location
- Hover tooltip appears with correct content
- Diagnostics appear in Problems panel
- Completion suggestions appear
- Add to CI (Phase 6)
- Create tokenization test suite
- Use
vscode-textmatelibrary - Load
dwscript.tmLanguage.json - Tokenize golden DWScript files
- Assert scopes for tricky constructs
- Generic types:
TList<Integer> - Attributes:
[TestAttribute] - Anonymous methods:
procedure(x: Integer) begin ... end - Class helpers:
type TIntegerHelper = class helper for Integer
- Generic types:
- Use
- Add to CI (Phase 6)
- Create comprehensive test corpus in
Test/- Basic syntax: variables, functions, classes
- Generics and constraints
- Attributes
- Anonymous methods
- Class helpers
- Conditional compilation
- Multi-file projects with
uses - Programs with errors (for diagnostics)
- Use in all test suites
Goal: Automate builds, tests, and releases.
- Create
.github/workflows/ci.yml - Matrix build
- Windows: Build server with Delphi (or FPC if cross-platform)
- Linux: Build with FPC (if supported)
- Node LTS: For client tests
- Install Delphi or FPC
- Checkout DWScript submodule
- Build
Server/dwsc.dpr - Upload
dwsc.exe/dwscas artifact
- Build
UnitTest/dwscTest.dpr - Run
dwscTest.exe --silent - Parse DUnit XML output
- Fail if any tests fail
- Install Python 3.x
- Install pytest-lsp:
pip install pytest-lsp - Download server artifact from build job
- Run
pytest Tests/Integration/ - Upload test results
-
cd Clients/VSCode -
npm install - Download server artifact and place in
bin/ - Run
npm test(VS Code headless tests) - Upload coverage
-
cd Clients/VSCode -
npm install - Run grammar tests with
vscode-textmate - Assert scopes match golden expectations
- Upload nightly builds
-
dwsc.exe(Windows) -
dwsc(Linux, if built) - VSIX package
-
- Create GitHub release on tag push
- Semantic versioning (e.g.,
v0.2.0) - Attach binaries
- Auto-generate changelog from commits
- Semantic versioning (e.g.,
- Auto-publish VSIX to VS Code Marketplace on release
- Use
vsce publishin GitHub Action - Requires publisher token (store in secrets)
- Use
Goal: Add power-user features for a best-in-class experience.
- Implement
textDocument/prepareRename- Check if symbol under cursor is renamable
- Return range and placeholder
- Implement
textDocument/rename- Find all references in workspace
- Build
WorkspaceEditwith all changes - Handle cross-file renames
- Validate new name (no conflicts)
- Test edge cases
- Rename class → updates constructor calls, type references
- Rename parameter → updates usages in function body
- Rename in comments (configurable?)
- Define semantic token legend
- Token types: namespace, class, enum, interface, struct, typeParameter, parameter, variable, property, enumMember, event, function, method, macro, keyword, modifier, comment, string, number, regexp, operator
- Token modifiers: declaration, definition, readonly, static, deprecated, abstract, async, modification, documentation, defaultLibrary
- Implement
textDocument/semanticTokens/full- Walk AST and emit token data (delta-encoded)
- Assign types and modifiers based on symbol kind
- Implement
textDocument/semanticTokens/full/delta- Incremental updates (only changed tokens)
- Implement
textDocument/semanticTokens/range- For visible viewport (performance optimization)
- Update
ServerCapabilitiesto advertise support
- Quick fixes for diagnostics
- Import missing unit
- Add missing semicolon
- Declare missing variable
- Refactorings
- Extract method
- Inline variable
- Convert to property
- Source actions
- Organize imports (sort
usesclause) - Remove unused imports
- Organize imports (sort
7.4 Formatting (textDocument/formatting, textDocument/rangeFormatting, textDocument/onTypeFormatting)
- Integrate DWScript formatter (if available)
- Or document external formatter usage
- Support format-on-save and format-on-type
- Respect editor settings (indent size, etc.)
- Identify foldable regions
- Functions, procedures, methods
- Classes, interfaces
-
begin/endblocks - Comments
- Return
FoldingRange[]with kind (comment, region)
- Implement "Expand Selection" feature
- Return nested ranges based on AST hierarchy
- Token → expression → statement → block → function
- Parse
usesclauses - Return links to unit files
- Make clickable in editor
- If DWScript supports color literals
- Extract and return
ColorInformation[] - Provide color picker integration
- Parameter names in function calls
- Type annotations for inferred variables
- Return type hints
7.10 Call Hierarchy (textDocument/prepareCallHierarchy, callHierarchy/incomingCalls, callHierarchy/outgoingCalls)
- Build call graph from AST
- Support incoming and outgoing call navigation
7.11 Type Hierarchy (textDocument/prepareTypeHierarchy, typeHierarchy/supertypes, typeHierarchy/subtypes)
- Build type inheritance graph
- Support supertypes and subtypes navigation
Goal: Make the server configurable and responsive to workspace changes.
- Handle configuration changes at runtime
- Supported settings (already in
package.json):-
dwsc.compilerSettings.libraryPaths→ re-index -
dwsc.compilerSettings.conditionalDefines→ re-compile -
dwsc.compilerSettings.assertion,optimizations,hintsLevel→ re-compile - All
dwsc.codeGenSettings.*→ re-compile
-
- Re-compile and re-index affected documents
- Report progress for long operations
- Workspace indexing
- Project compilation
- Find all references
- Use
WorkDoneProgressprotocol- Create token
- Send
begin,report,endnotifications
- Show in client UI (progress bar, status message)
- Honor
$/cancelRequestfor expensive operations- Workspace indexing
- Find all references
- Rename
- Check cancellation token periodically in loops
- Expose server-side commands via
workspace/executeCommand-
dwsc.reindexWorkspace→ force full re-index -
dwsc.clearCache→ clear compilation cache -
dwsc.showCompilerOutput→ display raw compiler output
-
- Register commands in
ServerCapabilities
Goal: Polish the VS Code extension for a great user experience.
- Status bar item
- Show "DWScript: Ready" / "Indexing..." / "Compiling..."
- Click to open output channel
- Output channel for server logs
- Stream LSP trace (if enabled)
- Show compilation errors/warnings
- Commands
- "DWScript: Restart Language Server"
- "DWScript: Show Compiler Output"
- "DWScript: Reindex Workspace"
- Code lens (optional)
- "X references" above functions/classes
- Click to show references
- Already configured in
package.json - Expand
snippets/dwscript.jsonwith common patterns- Class declaration
- Function/procedure
- Property
- Unit template
- Program template
- Anonymous method
- Attribute
- Review
dwscript-configuration.json- Comments (line, block)
- Brackets, auto-closing pairs
- Indentation rules
- Word patterns (for word selection)
- Folding markers
- Already has icon in
icon/128x128.png - Add larger icon (
256x256.png) for high-DPI displays - Update extension description and README
- Update
Clients/VSCode/README.md- Features list (with screenshots)
- Installation instructions
- Configuration guide
- Troubleshooting
- Add animated GIFs showing features in action
- Hover, completion, go-to-definition, etc.
Goal: Ensure the server works on all major platforms and is easy to install.
- Test server on Windows, Linux, macOS
- Build with Free Pascal Compiler (FPC) for portability
- Ensure DWScript library compiles with FPC
- Test all features on each platform
- Provide pre-built binaries for all platforms
- Windows x64
- Linux x64
- macOS x64 and ARM64
- Publish extension to marketplace
- Update
package.jsonversion - Add changelog
- Run
vsce publish
- Update
- Set up auto-publishing via GitHub Actions (Phase 6.8)
- Document how to use server with other editors
- Neovim (via
nvim-lspconfig) - Emacs (via
lsp-mode) - Sublime Text (via LSP plugin)
- Neovim (via
- Provide example configurations
- Create installer packages
- Windows: MSI or NSIS
- Linux: .deb, .rpm, AppImage
- macOS: .dmg or Homebrew formula
- Include server binary and VS Code extension
Goal: Ensure the server is fast and responsive, even for large codebases.
- Profile server with large workspaces
- Measure indexing time
- Measure completion latency
- Measure memory usage
- Identify bottlenecks
- Slow symbol resolution
- Excessive re-parsing
- Memory leaks
- Cache compiled units
- Re-compile only changed units and dependents
- Use timestamps/hashes to detect changes
- Index opened files first
- Index workspace in background (low priority)
- Defer indexing of large libraries until needed
- Debounce diagnostics after
didChange(500ms) - Throttle indexing updates
- Batch multiple changes before re-compiling
- Cache symbol resolutions
- Cache completion candidates
- Invalidate cache on relevant changes only
- Parse multiple files in parallel
- Index multiple units concurrently
- Use thread pool for background work
Goal: Build a sustainable project with good docs and an active community.
- User documentation
- Feature guide (hover, completion, etc.)
- Configuration reference
- FAQ
- Troubleshooting
- Developer documentation
- Architecture overview
- Protocol implementation notes
- How to contribute
- How to build from source
- How to run tests
- LSP compliance matrix
- List all LSP features
- Mark supported, partial, not supported
-
CONTRIBUTING.md- Code style guide
- Git workflow (fork, branch, PR)
- Running tests locally
- Submitting issues
- Add
CODE_OF_CONDUCT.md- Use Contributor Covenant or similar
- Maintain public roadmap
- Update this PLAN.md as features complete
- Track progress with GitHub Projects or milestones
- Maintain
CHANGELOG.md- Follow Keep a Changelog format
- Document breaking changes
- Set up discussions (GitHub Discussions)
- Create example projects showing off features
- Write blog posts or tutorials
- Submit to LSP showcase / awesome lists
Recommended Order:
- Phase 0 (Foundation) — Must be solid before building anything else
- Phase 1 (Document Sync) — Core infrastructure for all features
- Phase 2 (Fix Basic Features) — Quick wins, prove value early
- Phase 3 (Syntax Highlighting) — Critical for usability
- Phase 5 (Testing) — Start early, expand as features are added
- Phase 4 (Essential Features) — Completion, signature help (big productivity gains)
- Phase 6 (CI/CD) — Automate early to prevent regressions
- Phase 9 (Client Enhancements) — Polish the UX
- Phase 7 (Advanced Features) — Rename, semantic tokens, etc.
- Phase 8 (Configuration) — Dynamic behavior
- Phase 10 (Distribution) — Make it easy to install
- Phase 11 (Performance) — Optimize after features are stable
- Phase 12 (Docs & Community) — Ongoing, parallel with development
Phase 0-3 (Foundation):
- All LSP handshake tests pass
- Incremental sync works with 1000-line file
- Hover returns correct range and content
- Syntax highlighting looks good on all test files
Phase 4-6 (MVP):
- Completion provides useful suggestions in 95% of cases
- All unit tests pass
- All integration tests (pytest-lsp) pass
- CI runs on every commit and passes
Phase 7-9 (Advanced):
- Rename works across 10+ files
- Semantic tokens provide rich colorization
- Server feels snappy on 10,000-line workspace
Phase 10-12 (Production):
- Extension published to VS Code Marketplace
- 100+ downloads in first month
- Less than 5% error rate in telemetry (if added)
- Positive user feedback
- Pascal TextMate Grammar (MIT): https://marketplace.visualstudio.com/items?itemName=alefragnani.pascal
- Tree-sitter Pascal (MIT): https://github.com/Isopod/tree-sitter-pascal
- VS Code Extension Testing: https://code.visualstudio.com/api/working-with-extensions/testing-extension
- pytest-lsp: https://pypi.org/project/pytest-lsp/
- vscode-textmate: https://github.com/microsoft/vscode-textmate
- LSP Specification: https://microsoft.github.io/language-server-protocol/
- VS Code LSP Guide: https://code.visualstudio.com/api/language-extensions/language-server-extension-guide
- DWScript Documentation: (link to DWScript docs if available)
- This plan is living documentation. Update it as you complete tasks or discover new requirements.
- Focus on one phase at a time to avoid scope creep.
- Test continuously—don't wait until Phase 5 to start testing.
- Ask for feedback early from DWScript users to validate priorities.
- Celebrate milestones—each completed phase is a major achievement!
Last Updated: 2025-10-09 Status: Phase 1 - Sections 1.1, 1.2, and 1.3 completed. Ready to proceed to Section 1.4 (Project Model & Search Paths) Completed Sections:
- ✅ 1.1 TextDocumentSync (Full incremental synchronization with debouncing)
- ✅ 1.2 Per-Document Model (Document tracking with TDocumentModel)
- ✅ 1.3 Workspace Indexing (Background indexing, file watching, symbol search)