Skip to content

VS Code ObjectScript — Cross‐workspace Go to Definition

Leonardo Anders edited this page Sep 21, 2025 · 1 revision

VS Code ObjectScript — Cross-workspace Go to Definition

Wiki técnica da implementação para multi-root workspaces (DESENV7* ↔ COMP-7.0)


Sumário

  • Problema: F12 (Go to Definition) caía no servidor (isfs-readonly://) quando o alvo estava em uma pasta-irmã do workspace com namespace diferente (ex.: origem em DESENV75 → destino em COMP70).
  • Solução: O resolver agora procura primeiro arquivos locais também em outros folders do workspace. Foi adicionada a configuração objectscript.export.searchOtherWorkspaceFolders.
  • Impacto: F12 abre file:// do COMP-7.0 mesmo quando disparado de um DESENV7*, se houver cópia local. Só cai no servidor se não existir arquivo local.

O que mudou (alto nível)

  1. Nova config: objectscript.export.searchOtherWorkspaceFolders: string[]

    • Lista de nomes de folders do workspace a considerar antes do servidor.
    • Aceita "*" para todos os folders locais (não-ISFS).
  2. Ordem de resolução (prioridade):

    1. Pasta atual do arquivo (workspace folder ativo)
    2. Folders “iguais” (mesmo server+namespace — comportamento antigo)
    3. Folders listados em searchOtherWorkspaceFolders ou todos ("*")
    4. Fallback: servidor (isfs…)
  3. Código afetado:

    • src/providers/DocumentContentProvider.tsgetUri() expande a busca multi-root e chama findLocalUri para cada candidato.
    • package.json → schema da nova setting.
    • README / CHANGELOG atualizados.
  4. Testes:

    • Fixtures multi-root (client + shared)
    • Integração: garante file:// quando há cópia local e server URI quando não há.

Como configurar (exemplos reais)

1) .code-workspace (config comum)

Não defina objectscript.conn aqui para evitar conflito de namespace. Mantenha export, busca e demais ajustes globais.

{
  "folders": [
    { "name": "DESENV75", "path": "C:\\workspacecsw\\projetos\\7.5" },
    { "name": "COMP-7.0", "path": "C:\\workspacecsw\\projetos\\COMP-7.0" }
  ],
  "settings": {
    "search.exclude": {
      "**/.svn": true,
      "**/classes": true,
      "**/classescls": false,
      "**/outros": true,
      "**/paginas": true,
      "**/relatorios": true,
      "**/src": true
    },
    "objectscript.export": {
      "folder": ".",
      "atelier": true,
      "addCategory": false
    },
    "objectscript.syncLocalChanges": "all",
    "objectscript.compileOnSave": true
  }
}

2) Conexão por pasta (compila no namespace certo)

C:\workspacecsw\projetos\7.5\.vscode\settings.json

{
  "objectscript.conn": {
    "server": "consistem",
    "ns": "DESENV75",
    "host": "localhost",
    "port": 57772,
    "active": true
  },
  "objectscript.export": {
    "folder": ".",
    "atelier": true,
    "addCategory": false,
    "searchOtherWorkspaceFolders": [
      "COMP-7.0"
    ]
  },
  "objectscript.compileOnSave": true
}

C:\workspacecsw\projetos\COMP-7.0\.vscode\settings.json

{
  "objectscript.conn": {
    "server": "consistem",
    "ns": "COMP70",
    "host": "localhost",
    "port": 57772,
    "active": true
  },
  "objectscript.export": {
    "folder": ".",
    "atelier": true,
    "addCategory": false,
  },
  "objectscript.compileOnSave": true
}

Dica: para incluir todos os folders locais do workspace, use:

"searchOtherWorkspaceFolders": ["*"]

Quick Start / Passo a passo

  1. Atualize a extensão para a versão que contém a feature.

  2. No folder consumidor (ex.: 7.5), configure searchOtherWorkspaceFolders com "COMP-7.0" (ou "*").

  3. Garanta objectscript.conn por pasta (DESENV75 ↔ COMP70).

  4. Reload Window no VS Code.

  5. Abra um arquivo local em DESENV75 e tecle F12 para uma rotina do COMP70.

    • Esperado: abrir file://…COMP-7.0… (editável).
    • Apenas se não houver cópia local: abrir isfs… (read-only).

Troubleshooting

  • Ainda abre read-only:

    • Verifique se a rotina existe localmente no folder listado.
    • Confirme se você abriu a aba a partir da árvore local (não (localhost:57772)).
    • Use View → Output → ObjectScript e aumente o log para Debug para ver as pastas testadas.
  • Compilação falha no COMP70 com “Controle de fonte…”

    • É Server Source Control (SSC): faça checkout do item (ou alinhe a política).
    • A resolução de arquivo local (F12) é independente da compilação.

Como funcionam os testes (resumo)

  • Fixture multi-root: client (consumidor) e shared (fonte).
  • client configura "searchOtherWorkspaceFolders": ["shared"].
  • Teste 1: F12 em MultiRoot.Shared retorna file://…shared….
  • Teste 2: F12 em MultiRoot.ServerOnly (não existe local) retorna URI de servidor.
  • Helper aguarda o índice da extensão (até 10s) para evitar corrida.

FAQ

  • Preciso listar todas as pastas? Não. Use "*" para buscar todos os folders locais do workspace; ou liste só os que você quer priorizar.

  • Impacta performance? A busca tenta findLocalUri por folder. Para muitos roots, prefira nomear apenas os necessários (ou use "*" se aceitável).

  • Pode quebrar compilação? Não. Compilação continua regida por objectscript.conn do folder e pelo SSC do servidor.


Changelog (modelo)

### Enhancements
- Cross-workspace Go to Definition: adiciona `objectscript.export.searchOtherWorkspaceFolders` para priorizar arquivos locais em folders-irmãos do workspace antes de recorrer ao servidor.

Rollback

  • Remova searchOtherWorkspaceFolders das settings.
  • O comportamento volta a considerar somente a pasta atual (e irmãs de mesmo namespace), com fallback para servidor.