-
Notifications
You must be signed in to change notification settings - Fork 582
/
Copy pathemitHost.go
79 lines (66 loc) · 2.66 KB
/
emitHost.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package compiler
import (
"sync"
"github.com/microsoft/typescript-go/internal/ast"
"github.com/microsoft/typescript-go/internal/core"
"github.com/microsoft/typescript-go/internal/printer"
"github.com/microsoft/typescript-go/internal/tspath"
)
type WriteFileData struct {
SourceMapUrlPos int
// BuildInfo BuildInfo
Diagnostics []*ast.Diagnostic
DiffersOnlyInMap bool
SkippedDtsWrite bool
}
// NOTE: EmitHost operations must be thread-safe
type EmitHost interface {
Options() *core.CompilerOptions
SourceFiles() []*ast.SourceFile
UseCaseSensitiveFileNames() bool
GetCurrentDirectory() string
CommonSourceDirectory() string
IsEmitBlocked(file string) bool
WriteFile(fileName string, text string, writeByteOrderMark bool, relatedSourceFiles []*ast.SourceFile, data *WriteFileData) error
GetSourceFileMetaData(path tspath.Path) *ast.SourceFileMetaData
GetEmitResolver(file *ast.SourceFile, skipDiagnostics bool) printer.EmitResolver
}
var _ EmitHost = (*emitHost)(nil)
// NOTE: emitHost operations must be thread-safe
type emitHost struct {
program *Program
mu sync.RWMutex
// Map storing if there is emit blocking diagnostics for given input
hasEmitBlockingDiagnostics map[string]bool
}
func (host *emitHost) Options() *core.CompilerOptions { return host.program.Options() }
func (host *emitHost) SourceFiles() []*ast.SourceFile { return host.program.SourceFiles() }
func (host *emitHost) GetCurrentDirectory() string { return host.program.host.GetCurrentDirectory() }
func (host *emitHost) CommonSourceDirectory() string { return host.program.CommonSourceDirectory() }
func (host *emitHost) UseCaseSensitiveFileNames() bool {
return host.program.host.FS().UseCaseSensitiveFileNames()
}
func (host *emitHost) IsEmitBlocked(file string) bool {
host.mu.RLock()
blocked := host.hasEmitBlockingDiagnostics[file]
host.mu.RUnlock()
return blocked
}
func (host *emitHost) SetEmitBlocked(file string, blocked bool) {
host.mu.Lock()
defer host.mu.Unlock()
if host.hasEmitBlockingDiagnostics == nil {
host.hasEmitBlockingDiagnostics = make(map[string]bool)
}
host.hasEmitBlockingDiagnostics[file] = blocked
}
func (host *emitHost) WriteFile(fileName string, text string, writeByteOrderMark bool, _ []*ast.SourceFile, _ *WriteFileData) error {
return host.program.host.FS().WriteFile(fileName, text, writeByteOrderMark)
}
func (host *emitHost) GetEmitResolver(file *ast.SourceFile, skipDiagnostics bool) printer.EmitResolver {
checker := host.program.GetTypeCheckerForFile(file)
return checker.GetEmitResolver(file, skipDiagnostics)
}
func (host *emitHost) GetSourceFileMetaData(path tspath.Path) *ast.SourceFileMetaData {
return host.program.GetSourceFileMetaData(path)
}