Skip to content

Commit f97e702

Browse files
authored
fix(lsp): add client callbacks for all resolver methods (#24)
1 parent 649fc07 commit f97e702

File tree

2 files changed

+122
-20
lines changed

2 files changed

+122
-20
lines changed

internal/lsp/lsproto/lsp_generated.go

Lines changed: 23 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/lsp/server.go

Lines changed: 99 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"iter"
99
"runtime/debug"
1010
"slices"
11+
"strings"
1112
"sync"
1213
"sync/atomic"
1314
"time"
@@ -438,13 +439,7 @@ func (r *denoResolver) ResolveModuleName(moduleName string, containingFile strin
438439
}
439440
var response *lsproto.DenoResolution
440441
err := r.server.sendRequestSync(r.ctx, lsproto.MethodDenoCallback, params, &response)
441-
if err != nil {
442-
return &module.ResolvedModule{
443-
ResolvedFileName: "",
444-
Extension: "",
445-
}, nil
446-
}
447-
if response == nil {
442+
if err != nil || response == nil {
448443
return &module.ResolvedModule{
449444
ResolvedFileName: "",
450445
Extension: "",
@@ -459,30 +454,116 @@ func (r *denoResolver) ResolveModuleName(moduleName string, containingFile strin
459454
func (r *denoResolver) ResolveTypeReferenceDirective(name string, containingFile string,
460455
resolutionMode core.ResolutionMode,
461456
redirectedReference module.ResolvedProjectReference) (*module.ResolvedTypeReferenceDirective, []module.DiagAndArgs) {
462-
// TODO(nayeemrmn): Implement callback.
463-
return r.inner.ResolveTypeReferenceDirective(name, containingFile, resolutionMode, redirectedReference)
457+
params := lsproto.DenoCallbackParams{
458+
ResolveModuleName: &lsproto.DenoResolveModuleNameParams{
459+
ModuleName: name,
460+
ReferrerUri: lsconv.FileNameToDocumentURI(containingFile),
461+
ImportAttributeType: nil,
462+
ResolutionMode: int32(resolutionMode),
463+
CompilerOptionsKey: r.compilerOptionsKey,
464+
},
465+
}
466+
var response *lsproto.DenoResolution
467+
err := r.server.sendRequestSync(r.ctx, lsproto.MethodDenoCallback, params, &response)
468+
if err != nil || response == nil {
469+
return &module.ResolvedTypeReferenceDirective{
470+
ResolvedFileName: "",
471+
Primary: true,
472+
}, nil
473+
}
474+
return &module.ResolvedTypeReferenceDirective{
475+
ResolvedFileName: response.Uri.FileName(),
476+
Primary: true,
477+
}, nil
464478
}
465479

466480
func (r *denoResolver) ResolvePackageDirectory(moduleName string, containingFile string,
467481
resolutionMode core.ResolutionMode,
468482
redirectedReference module.ResolvedProjectReference) *module.ResolvedModule {
469-
// TODO(nayeemrmn): Implement callback.
470-
return r.inner.ResolvePackageDirectory(moduleName, containingFile, resolutionMode, redirectedReference)
483+
params := lsproto.DenoCallbackParams{
484+
ResolveModuleName: &lsproto.DenoResolveModuleNameParams{
485+
ModuleName: moduleName,
486+
ReferrerUri: lsconv.FileNameToDocumentURI(containingFile),
487+
ImportAttributeType: nil,
488+
ResolutionMode: int32(resolutionMode),
489+
CompilerOptionsKey: r.compilerOptionsKey,
490+
},
491+
}
492+
var response *lsproto.DenoResolution
493+
err := r.server.sendRequestSync(r.ctx, lsproto.MethodDenoCallback, params, &response)
494+
if err != nil || response == nil {
495+
return &module.ResolvedModule{
496+
ResolvedFileName: "",
497+
Extension: "",
498+
}
499+
}
500+
return &module.ResolvedModule{
501+
ResolvedFileName: response.Uri.FileName(),
502+
Extension: response.Extension,
503+
}
471504
}
472505

473-
func (r *denoResolver) ResolveJsxImportSource(referrer string) string {
474-
// TODO(nayeemrmn): Implement callback.
475-
return r.inner.ResolveJsxImportSource(referrer)
506+
func (r *denoResolver) ResolveJsxImportSource(_referrer string) string {
507+
params := lsproto.DenoCallbackParams{
508+
ResolveJsxImportSource: &lsproto.DenoResolveJsxImportSourceParams{
509+
CompilerOptionsKey: r.compilerOptionsKey,
510+
},
511+
}
512+
var response *string
513+
err := r.server.sendRequestSync(r.ctx, lsproto.MethodDenoCallback, params, &response)
514+
if err != nil || response == nil {
515+
return ""
516+
}
517+
return *response
476518
}
477519

478520
func (r *denoResolver) GetPackageScopeForPath(directory string) *packagejson.InfoCacheEntry {
479-
// TODO(nayeemrmn): Implement callback.
480-
return r.inner.GetPackageScopeForPath(directory)
521+
if strings.HasPrefix(directory, "^/") {
522+
return nil
523+
}
524+
params := lsproto.DenoCallbackParams{
525+
GetPackageScopeForPath: &lsproto.DenoGetPackageScopeForPathParams{
526+
DirectoryPath: directory,
527+
},
528+
}
529+
var response *lsproto.DenoPackageJsonScope
530+
err := r.server.sendRequestSync(r.ctx, lsproto.MethodDenoCallback, params, &response)
531+
if err != nil || response == nil {
532+
return nil
533+
}
534+
fields, err := packagejson.Parse([]byte(response.PackageJsonText))
535+
if err != nil {
536+
return &packagejson.InfoCacheEntry{
537+
PackageDirectory: response.PackageDirectoryPath,
538+
DirectoryExists: true,
539+
Contents: &packagejson.PackageJson{
540+
Parseable: false,
541+
},
542+
}
543+
}
544+
return &packagejson.InfoCacheEntry{
545+
PackageDirectory: response.PackageDirectoryPath,
546+
DirectoryExists: true,
547+
Contents: &packagejson.PackageJson{
548+
Fields: fields,
549+
Parseable: true,
550+
},
551+
}
481552
}
482553

483554
func (r *denoResolver) GetImpliedNodeFormatForFile(path string, packageJsonType string) core.ModuleKind {
484-
// TODO(nayeemrmn): Implement callback.
485-
return r.inner.GetImpliedNodeFormatForFile(path, packageJsonType)
555+
params := lsproto.DenoCallbackParams{
556+
GetImpliedNodeFormatForFile: &lsproto.DenoGetImpliedNodeFormatForFileParams{
557+
Uri: lsconv.FileNameToDocumentURI(path),
558+
CompilerOptionsKey: r.compilerOptionsKey,
559+
},
560+
}
561+
var response core.ModuleKind
562+
err := r.server.sendRequestSync(r.ctx, lsproto.MethodDenoCallback, params, &response)
563+
if err != nil {
564+
return core.ModuleKindESNext
565+
}
566+
return response
486567
}
487568

488569
type Server struct {

0 commit comments

Comments
 (0)