@crownpeak/dqm-react-component-dev-mcp 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- package/src/index.js +395 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
use anyhow::Result;
|
|
2
|
+
use probe_code::language::parser::parse_file_for_code_blocks;
|
|
3
|
+
use std::collections::HashSet;
|
|
4
|
+
|
|
5
|
+
/// Test line comment context extension across multiple programming languages
|
|
6
|
+
/// This ensures that when line comments are found by search, they are extended
|
|
7
|
+
/// to include their meaningful parent context (functions, methods, classes, etc.)
|
|
8
|
+
/// rather than being returned as isolated single-line snippets.
|
|
9
|
+
|
|
10
|
+
#[test]
|
|
11
|
+
fn test_rust_line_comment_context_extension() -> Result<()> {
|
|
12
|
+
let rust_code = r#"
|
|
13
|
+
pub fn process_tokens(text: &str) -> Vec<String> {
|
|
14
|
+
let tokens = tokenize(text);
|
|
15
|
+
tokens
|
|
16
|
+
.into_iter()
|
|
17
|
+
.map(|token| normalize(token)) // normalize each token
|
|
18
|
+
.collect()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
#[cfg(test)]
|
|
22
|
+
mod tests {
|
|
23
|
+
use super::*;
|
|
24
|
+
|
|
25
|
+
#[test]
|
|
26
|
+
fn test_processing() {
|
|
27
|
+
let result = process_tokens("hello world");
|
|
28
|
+
assert_eq!(result.len(), 2); // should have two tokens
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
"#;
|
|
32
|
+
|
|
33
|
+
let mut line_numbers = HashSet::new();
|
|
34
|
+
line_numbers.insert(6); // Line with "// normalize each token"
|
|
35
|
+
line_numbers.insert(16); // Line with "// should have two tokens"
|
|
36
|
+
|
|
37
|
+
let result = parse_file_for_code_blocks(rust_code, "rs", &line_numbers, true, None)?;
|
|
38
|
+
|
|
39
|
+
println!("Rust results:");
|
|
40
|
+
for (i, block) in result.iter().enumerate() {
|
|
41
|
+
println!(
|
|
42
|
+
" Block {}: type='{}', lines={}-{}",
|
|
43
|
+
i,
|
|
44
|
+
block.node_type,
|
|
45
|
+
block.start_row + 1,
|
|
46
|
+
block.end_row + 1
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Line comment should be extended to include parent function
|
|
51
|
+
assert!(
|
|
52
|
+
result.iter().any(|block| {
|
|
53
|
+
block.node_type == "function_item"
|
|
54
|
+
&& block.start_row <= 6
|
|
55
|
+
&& block.end_row >= 6
|
|
56
|
+
&& block.end_row > block.start_row // Not a single-line block
|
|
57
|
+
}),
|
|
58
|
+
"Rust line comment should be extended to parent function"
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// Test function comment should be extended to include parent test function
|
|
62
|
+
assert!(
|
|
63
|
+
result.iter().any(|block| {
|
|
64
|
+
(block.node_type == "function_item" || block.node_type.contains("test"))
|
|
65
|
+
&& block.start_row <= 16
|
|
66
|
+
&& block.end_row >= 16
|
|
67
|
+
&& block.end_row > block.start_row // Not a single-line block
|
|
68
|
+
}),
|
|
69
|
+
"Rust test comment should be extended to parent test function"
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
Ok(())
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
#[test]
|
|
76
|
+
fn test_javascript_line_comment_context_extension() -> Result<()> {
|
|
77
|
+
let js_code = r#"
|
|
78
|
+
function processData(data) {
|
|
79
|
+
const processed = data.map(item => {
|
|
80
|
+
return item.value * 2; // double the value
|
|
81
|
+
});
|
|
82
|
+
return processed;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
class DataProcessor {
|
|
86
|
+
constructor() {
|
|
87
|
+
this.multiplier = 3; // default multiplier
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
process(value) {
|
|
91
|
+
return value * this.multiplier; // apply multiplier
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
"#;
|
|
95
|
+
|
|
96
|
+
let mut line_numbers = HashSet::new();
|
|
97
|
+
line_numbers.insert(4); // Line with "// double the value"
|
|
98
|
+
line_numbers.insert(10); // Line with "// default multiplier"
|
|
99
|
+
line_numbers.insert(14); // Line with "// apply multiplier"
|
|
100
|
+
|
|
101
|
+
let result = parse_file_for_code_blocks(js_code, "js", &line_numbers, true, None)?;
|
|
102
|
+
|
|
103
|
+
println!("JavaScript results:");
|
|
104
|
+
for (i, block) in result.iter().enumerate() {
|
|
105
|
+
println!(
|
|
106
|
+
" Block {}: type='{}', lines={}-{}",
|
|
107
|
+
i,
|
|
108
|
+
block.node_type,
|
|
109
|
+
block.start_row + 1,
|
|
110
|
+
block.end_row + 1
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Comments should be extended to their parent contexts
|
|
115
|
+
assert!(
|
|
116
|
+
result.iter().any(|block| {
|
|
117
|
+
(block.node_type == "function_declaration"
|
|
118
|
+
|| block.node_type == "function"
|
|
119
|
+
|| block.node_type == "statement_block")
|
|
120
|
+
&& block.start_row <= 4
|
|
121
|
+
&& block.end_row >= 4
|
|
122
|
+
&& block.end_row > block.start_row
|
|
123
|
+
}),
|
|
124
|
+
"JavaScript function comment should be extended to parent function or block, got: {:?}",
|
|
125
|
+
result
|
|
126
|
+
.iter()
|
|
127
|
+
.map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
|
|
128
|
+
.collect::<Vec<_>>()
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
// Note: The primary goal is that most comments get extended context.
|
|
132
|
+
// Some comments (like property identifiers) may remain single-line, which is acceptable.
|
|
133
|
+
// We mainly want to ensure function-level comments are extended.
|
|
134
|
+
let function_comment_extended = result.iter().any(|block| {
|
|
135
|
+
block.node_type == "statement_block"
|
|
136
|
+
&& block.start_row <= 4
|
|
137
|
+
&& block.end_row >= 4
|
|
138
|
+
&& block.end_row > block.start_row
|
|
139
|
+
});
|
|
140
|
+
assert!(
|
|
141
|
+
function_comment_extended,
|
|
142
|
+
"JavaScript function comments should be extended, got: {:?}",
|
|
143
|
+
result
|
|
144
|
+
.iter()
|
|
145
|
+
.map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
|
|
146
|
+
.collect::<Vec<_>>()
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
Ok(())
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
#[test]
|
|
153
|
+
fn test_python_line_comment_context_extension() -> Result<()> {
|
|
154
|
+
let python_code = r#"
|
|
155
|
+
def calculate_score(points):
|
|
156
|
+
total = sum(points)
|
|
157
|
+
average = total / len(points) # calculate average
|
|
158
|
+
return average * 1.2 # apply bonus multiplier
|
|
159
|
+
|
|
160
|
+
class ScoreCalculator:
|
|
161
|
+
def __init__(self):
|
|
162
|
+
self.bonus = 1.5 # default bonus factor
|
|
163
|
+
|
|
164
|
+
def process(self, data):
|
|
165
|
+
return data * self.bonus # apply bonus
|
|
166
|
+
"#;
|
|
167
|
+
|
|
168
|
+
let mut line_numbers = HashSet::new();
|
|
169
|
+
line_numbers.insert(4); // Line with "# calculate average"
|
|
170
|
+
line_numbers.insert(5); // Line with "# apply bonus multiplier"
|
|
171
|
+
line_numbers.insert(9); // Line with "# default bonus factor"
|
|
172
|
+
line_numbers.insert(12); // Line with "# apply bonus"
|
|
173
|
+
|
|
174
|
+
let result = parse_file_for_code_blocks(python_code, "py", &line_numbers, true, None)?;
|
|
175
|
+
|
|
176
|
+
println!("Python results:");
|
|
177
|
+
for (i, block) in result.iter().enumerate() {
|
|
178
|
+
println!(
|
|
179
|
+
" Block {}: type='{}', lines={}-{}",
|
|
180
|
+
i,
|
|
181
|
+
block.node_type,
|
|
182
|
+
block.start_row + 1,
|
|
183
|
+
block.end_row + 1
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Comments should be extended to their parent contexts
|
|
188
|
+
assert!(
|
|
189
|
+
result.iter().any(|block| {
|
|
190
|
+
(block.node_type == "function_definition"
|
|
191
|
+
|| block.node_type == "function"
|
|
192
|
+
|| block.node_type == "block")
|
|
193
|
+
&& block.start_row <= 4
|
|
194
|
+
&& block.end_row >= 4
|
|
195
|
+
&& block.end_row > block.start_row
|
|
196
|
+
}),
|
|
197
|
+
"Python function comment should be extended to parent function or block, got: {:?}",
|
|
198
|
+
result
|
|
199
|
+
.iter()
|
|
200
|
+
.map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
|
|
201
|
+
.collect::<Vec<_>>()
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Note: The primary goal is that most comments get extended context.
|
|
205
|
+
// Some comments may remain single-line, which is acceptable.
|
|
206
|
+
// We mainly want to ensure function-level comments are extended.
|
|
207
|
+
let function_comment_extended = result.iter().any(|block| {
|
|
208
|
+
block.node_type == "block"
|
|
209
|
+
&& block.start_row <= 4
|
|
210
|
+
&& block.end_row >= 4
|
|
211
|
+
&& block.end_row > block.start_row
|
|
212
|
+
});
|
|
213
|
+
assert!(
|
|
214
|
+
function_comment_extended,
|
|
215
|
+
"Python function comments should be extended, got: {:?}",
|
|
216
|
+
result
|
|
217
|
+
.iter()
|
|
218
|
+
.map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
|
|
219
|
+
.collect::<Vec<_>>()
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
Ok(())
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
#[test]
|
|
226
|
+
fn test_typescript_line_comment_context_extension() -> Result<()> {
|
|
227
|
+
let ts_code = r#"
|
|
228
|
+
interface User {
|
|
229
|
+
name: string;
|
|
230
|
+
age: number; // user's age in years
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function processUser(user: User): string {
|
|
234
|
+
return `${user.name}: ${user.age}`; // format user info
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
class UserManager {
|
|
238
|
+
private users: User[] = []; // internal user storage
|
|
239
|
+
|
|
240
|
+
addUser(user: User): void {
|
|
241
|
+
this.users.push(user); // add to collection
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
"#;
|
|
245
|
+
|
|
246
|
+
let mut line_numbers = HashSet::new();
|
|
247
|
+
line_numbers.insert(4); // Line with "// user's age in years"
|
|
248
|
+
line_numbers.insert(8); // Line with "// format user info"
|
|
249
|
+
line_numbers.insert(12); // Line with "// internal user storage"
|
|
250
|
+
line_numbers.insert(15); // Line with "// add to collection"
|
|
251
|
+
|
|
252
|
+
let result = parse_file_for_code_blocks(ts_code, "ts", &line_numbers, true, None)?;
|
|
253
|
+
|
|
254
|
+
println!("TypeScript results:");
|
|
255
|
+
for (i, block) in result.iter().enumerate() {
|
|
256
|
+
println!(
|
|
257
|
+
" Block {}: type='{}', lines={}-{}",
|
|
258
|
+
i,
|
|
259
|
+
block.node_type,
|
|
260
|
+
block.start_row + 1,
|
|
261
|
+
block.end_row + 1
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Comments should be extended to their parent contexts
|
|
266
|
+
assert!(
|
|
267
|
+
result.iter().any(|block| {
|
|
268
|
+
block.node_type == "interface_declaration"
|
|
269
|
+
&& block.start_row <= 4
|
|
270
|
+
&& block.end_row >= 4
|
|
271
|
+
&& block.end_row > block.start_row
|
|
272
|
+
}),
|
|
273
|
+
"TypeScript interface comment should be extended to parent interface"
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
assert!(
|
|
277
|
+
result.iter().any(|block| {
|
|
278
|
+
(block.node_type == "function_declaration" || block.node_type == "function")
|
|
279
|
+
&& block.start_row <= 8
|
|
280
|
+
&& block.end_row >= 8
|
|
281
|
+
&& block.end_row > block.start_row
|
|
282
|
+
}),
|
|
283
|
+
"TypeScript function comment should be extended to parent function"
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
Ok(())
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
#[test]
|
|
290
|
+
fn test_go_line_comment_context_extension() -> Result<()> {
|
|
291
|
+
let go_code = r#"
|
|
292
|
+
package main
|
|
293
|
+
|
|
294
|
+
func calculateTotal(prices []float64) float64 {
|
|
295
|
+
var total float64
|
|
296
|
+
for _, price := range prices {
|
|
297
|
+
total += price // accumulate total
|
|
298
|
+
}
|
|
299
|
+
return total * 1.1 // add 10% tax
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
type Calculator struct {
|
|
303
|
+
taxRate float64 // tax rate as decimal
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
func (c *Calculator) Process(value float64) float64 {
|
|
307
|
+
return value * c.taxRate // apply tax rate
|
|
308
|
+
}
|
|
309
|
+
"#;
|
|
310
|
+
|
|
311
|
+
let mut line_numbers = HashSet::new();
|
|
312
|
+
line_numbers.insert(7); // Line with "// accumulate total"
|
|
313
|
+
line_numbers.insert(9); // Line with "// add 10% tax"
|
|
314
|
+
line_numbers.insert(13); // Line with "// tax rate as decimal"
|
|
315
|
+
line_numbers.insert(17); // Line with "// apply tax rate"
|
|
316
|
+
|
|
317
|
+
let result = parse_file_for_code_blocks(go_code, "go", &line_numbers, true, None)?;
|
|
318
|
+
|
|
319
|
+
println!("Go results:");
|
|
320
|
+
for (i, block) in result.iter().enumerate() {
|
|
321
|
+
println!(
|
|
322
|
+
" Block {}: type='{}', lines={}-{}",
|
|
323
|
+
i,
|
|
324
|
+
block.node_type,
|
|
325
|
+
block.start_row + 1,
|
|
326
|
+
block.end_row + 1
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Comments should be extended to their parent contexts
|
|
331
|
+
assert!(
|
|
332
|
+
result.iter().any(|block| {
|
|
333
|
+
(block.node_type == "function_declaration" || block.node_type == "func_declaration")
|
|
334
|
+
&& block.start_row <= 7
|
|
335
|
+
&& block.end_row >= 7
|
|
336
|
+
&& block.end_row > block.start_row
|
|
337
|
+
}),
|
|
338
|
+
"Go function comment should be extended to parent function"
|
|
339
|
+
);
|
|
340
|
+
|
|
341
|
+
assert!(
|
|
342
|
+
result.iter().any(|block| {
|
|
343
|
+
(block.node_type == "type_declaration" || block.node_type == "struct_type")
|
|
344
|
+
&& block.start_row <= 13
|
|
345
|
+
&& block.end_row >= 13
|
|
346
|
+
&& block.end_row > block.start_row
|
|
347
|
+
}),
|
|
348
|
+
"Go struct comment should be extended to parent type"
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
Ok(())
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
#[test]
|
|
355
|
+
fn test_java_line_comment_context_extension() -> Result<()> {
|
|
356
|
+
let java_code = r#"
|
|
357
|
+
public class Calculator {
|
|
358
|
+
private double rate = 0.1; // default tax rate
|
|
359
|
+
|
|
360
|
+
public double calculate(double amount) {
|
|
361
|
+
return amount * (1 + rate); // apply tax rate
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
public static void main(String[] args) {
|
|
365
|
+
Calculator calc = new Calculator();
|
|
366
|
+
double result = calc.calculate(100.0); // test calculation
|
|
367
|
+
System.out.println(result);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
"#;
|
|
371
|
+
|
|
372
|
+
let mut line_numbers = HashSet::new();
|
|
373
|
+
line_numbers.insert(3); // Line with "// default tax rate"
|
|
374
|
+
line_numbers.insert(6); // Line with "// apply tax rate"
|
|
375
|
+
line_numbers.insert(11); // Line with "// test calculation"
|
|
376
|
+
|
|
377
|
+
let result = parse_file_for_code_blocks(java_code, "java", &line_numbers, true, None)?;
|
|
378
|
+
|
|
379
|
+
println!("Java results:");
|
|
380
|
+
for (i, block) in result.iter().enumerate() {
|
|
381
|
+
println!(
|
|
382
|
+
" Block {}: type='{}', lines={}-{}",
|
|
383
|
+
i,
|
|
384
|
+
block.node_type,
|
|
385
|
+
block.start_row + 1,
|
|
386
|
+
block.end_row + 1
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Comments should be extended to their parent contexts
|
|
391
|
+
assert!(
|
|
392
|
+
result.iter().any(|block| {
|
|
393
|
+
(block.node_type == "class_declaration" || block.node_type == "method_declaration")
|
|
394
|
+
&& block.start_row <= 3
|
|
395
|
+
&& block.end_row >= 3
|
|
396
|
+
&& block.end_row > block.start_row
|
|
397
|
+
}),
|
|
398
|
+
"Java class field comment should be extended to parent class or method, got: {:?}",
|
|
399
|
+
result
|
|
400
|
+
.iter()
|
|
401
|
+
.map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
|
|
402
|
+
.collect::<Vec<_>>()
|
|
403
|
+
);
|
|
404
|
+
|
|
405
|
+
assert!(
|
|
406
|
+
result.iter().any(|block| {
|
|
407
|
+
(block.node_type == "method_declaration"
|
|
408
|
+
|| block.node_type == "function"
|
|
409
|
+
|| block.node_type == "block")
|
|
410
|
+
&& block.start_row <= 6
|
|
411
|
+
&& block.end_row >= 6
|
|
412
|
+
&& block.end_row > block.start_row
|
|
413
|
+
}),
|
|
414
|
+
"Java method comment should be extended to parent method or block, got: {:?}",
|
|
415
|
+
result
|
|
416
|
+
.iter()
|
|
417
|
+
.map(|b| (&b.node_type, b.start_row + 1, b.end_row + 1))
|
|
418
|
+
.collect::<Vec<_>>()
|
|
419
|
+
);
|
|
420
|
+
|
|
421
|
+
Ok(())
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/// Test that verifies line comments are NOT returned as single-line blocks
|
|
425
|
+
/// This is the core issue - line comments should always be extended to their parent context
|
|
426
|
+
#[test]
|
|
427
|
+
fn test_no_single_line_comment_blocks() -> Result<()> {
|
|
428
|
+
let rust_code = r#"
|
|
429
|
+
fn example() {
|
|
430
|
+
let x = 42; // this is a comment
|
|
431
|
+
println!("{}", x);
|
|
432
|
+
}
|
|
433
|
+
"#;
|
|
434
|
+
|
|
435
|
+
let mut line_numbers = HashSet::new();
|
|
436
|
+
line_numbers.insert(3); // Line with comment
|
|
437
|
+
|
|
438
|
+
let result = parse_file_for_code_blocks(rust_code, "rs", &line_numbers, true, None)?;
|
|
439
|
+
|
|
440
|
+
// Verify no single-line blocks are returned for comment lines
|
|
441
|
+
for block in &result {
|
|
442
|
+
if block.start_row == 3 && block.end_row == 3 {
|
|
443
|
+
panic!(
|
|
444
|
+
"Found single-line block for comment line - this should not happen! Block type: {}",
|
|
445
|
+
block.node_type
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Should have at least one block that includes the comment line but extends beyond it
|
|
451
|
+
assert!(
|
|
452
|
+
result.iter().any(|block| {
|
|
453
|
+
block.start_row <= 3 && block.end_row >= 3 && block.end_row > block.start_row
|
|
454
|
+
}),
|
|
455
|
+
"Should have extended block containing the comment line"
|
|
456
|
+
);
|
|
457
|
+
|
|
458
|
+
Ok(())
|
|
459
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
use probe_code::language::parser::parse_file_for_code_blocks;
|
|
2
|
+
use std::collections::HashSet;
|
|
3
|
+
|
|
4
|
+
#[test]
|
|
5
|
+
fn test_line_map_cache() {
|
|
6
|
+
// Set up test content
|
|
7
|
+
let content = r#"
|
|
8
|
+
fn test_function() {
|
|
9
|
+
// This is a comment
|
|
10
|
+
let x = 42;
|
|
11
|
+
println!("Hello, world!");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
struct TestStruct {
|
|
15
|
+
field1: i32,
|
|
16
|
+
field2: String,
|
|
17
|
+
}
|
|
18
|
+
"#;
|
|
19
|
+
|
|
20
|
+
// Create a set of line numbers to extract
|
|
21
|
+
let mut line_numbers = HashSet::new();
|
|
22
|
+
line_numbers.insert(3); // Comment line
|
|
23
|
+
line_numbers.insert(4); // Code line
|
|
24
|
+
line_numbers.insert(8); // Struct field line
|
|
25
|
+
|
|
26
|
+
// First call should be a cache miss
|
|
27
|
+
let result1 = parse_file_for_code_blocks(content, "rs", &line_numbers, true, None).unwrap();
|
|
28
|
+
|
|
29
|
+
// Print result1 details
|
|
30
|
+
println!("Cache miss result (result1) - {} blocks:", result1.len());
|
|
31
|
+
for (i, block) in result1.iter().enumerate() {
|
|
32
|
+
println!(
|
|
33
|
+
" Block {}: type='{}', lines={}-{}",
|
|
34
|
+
i,
|
|
35
|
+
block.node_type,
|
|
36
|
+
block.start_row + 1,
|
|
37
|
+
block.end_row + 1
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Second call should be a cache hit
|
|
42
|
+
let result2 = parse_file_for_code_blocks(content, "rs", &line_numbers, true, None).unwrap();
|
|
43
|
+
|
|
44
|
+
// Print result2 details
|
|
45
|
+
println!("Cache hit result (result2) - {} blocks:", result2.len());
|
|
46
|
+
for (i, block) in result2.iter().enumerate() {
|
|
47
|
+
println!(
|
|
48
|
+
" Block {}: type='{}', lines={}-{}",
|
|
49
|
+
i,
|
|
50
|
+
block.node_type,
|
|
51
|
+
block.start_row + 1,
|
|
52
|
+
block.end_row + 1
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Assert that the results from cache miss and cache hit are identical
|
|
57
|
+
assert_eq!(
|
|
58
|
+
result1, result2,
|
|
59
|
+
"Cache miss and cache hit results should be identical"
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
// Test with different allow_tests flag
|
|
63
|
+
let result3 = parse_file_for_code_blocks(content, "rs", &line_numbers, false, None).unwrap();
|
|
64
|
+
|
|
65
|
+
// Should be a different cache entry, but results should be similar since there are no tests
|
|
66
|
+
// Check that result3 covers all requested lines
|
|
67
|
+
let requested_lines: Vec<usize> = line_numbers.iter().cloned().collect(); // Define requested_lines here
|
|
68
|
+
for &line in &requested_lines {
|
|
69
|
+
let line_covered = result3
|
|
70
|
+
.iter()
|
|
71
|
+
.any(|block| line > block.start_row && line <= block.end_row + 1);
|
|
72
|
+
assert!(
|
|
73
|
+
line_covered,
|
|
74
|
+
"Line {line} not covered by any block in result3"
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#[test]
|
|
80
|
+
fn test_line_map_cache_with_different_content() {
|
|
81
|
+
// Set up test content
|
|
82
|
+
let content1 = r#"
|
|
83
|
+
fn test_function() {
|
|
84
|
+
// This is a comment
|
|
85
|
+
let x = 42;
|
|
86
|
+
}
|
|
87
|
+
"#;
|
|
88
|
+
|
|
89
|
+
let content2 = r#"
|
|
90
|
+
fn test_function() {
|
|
91
|
+
// This is a different comment
|
|
92
|
+
let x = 100;
|
|
93
|
+
}
|
|
94
|
+
"#;
|
|
95
|
+
|
|
96
|
+
// Create a set of line numbers to extract
|
|
97
|
+
let mut line_numbers = HashSet::new();
|
|
98
|
+
line_numbers.insert(3); // Comment line
|
|
99
|
+
|
|
100
|
+
// First call with content1
|
|
101
|
+
let result1 = parse_file_for_code_blocks(content1, "rs", &line_numbers, true, None).unwrap();
|
|
102
|
+
|
|
103
|
+
// Second call with content2 (should be a cache miss due to different content)
|
|
104
|
+
let result2 = parse_file_for_code_blocks(content2, "rs", &line_numbers, true, None).unwrap();
|
|
105
|
+
|
|
106
|
+
// Results should be different (different comment text)
|
|
107
|
+
assert_eq!(result1.len(), result2.len()); // Same number of blocks
|
|
108
|
+
assert_eq!(result1[0].start_row, result2[0].start_row); // Same start row
|
|
109
|
+
assert_eq!(result1[0].end_row, result2[0].end_row); // Same end row
|
|
110
|
+
assert_eq!(result1[0].node_type, result2[0].node_type); // Same node type
|
|
111
|
+
|
|
112
|
+
// But the content is different, which we can't directly test here since we don't have access to the content
|
|
113
|
+
// In a real-world scenario, the extracted code blocks would contain different text
|
|
114
|
+
}
|