forked from codesandbox/codesandbox-client
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresolver.ts
More file actions
149 lines (123 loc) · 3.83 KB
/
resolver.ts
File metadata and controls
149 lines (123 loc) · 3.83 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
'use strict';
import { IRawGrammar, IOnigLib } from '../types';
import { parseRawGrammar } from '../grammarReader';
import { RegistryOptions, Thenable } from '../main';
import * as path from 'path';
import * as fs from 'fs';
export interface ILanguageRegistration {
id: string;
extensions: string[];
filenames: string[];
}
export interface IGrammarRegistration {
language: string;
scopeName: string;
path: string;
embeddedLanguages: { [scopeName: string]: string; };
grammar?: Thenable<IRawGrammar>;
}
export class Resolver implements RegistryOptions {
public readonly language2id: { [languages: string]: number; };
private _lastLanguageId: number;
private _id2language: string[];
private readonly _grammars: IGrammarRegistration[];
private readonly _languages: ILanguageRegistration[];
private readonly _onigLibPromise: Thenable<IOnigLib>;
private readonly _onigLibName: string;
constructor(grammars: IGrammarRegistration[], languages: ILanguageRegistration[], onigLibPromise: Thenable<IOnigLib>, onigLibName: string) {
this._grammars = grammars;
this._languages = languages;
this._onigLibPromise = onigLibPromise;
this._onigLibName = onigLibName;
this.language2id = Object.create(null);
this._lastLanguageId = 0;
this._id2language = [];
for (let i = 0; i < this._languages.length; i++) {
let languageId = ++this._lastLanguageId;
this.language2id[this._languages[i].id] = languageId;
this._id2language[languageId] = this._languages[i].id;
}
}
public getOnigLib(): Thenable<IOnigLib> {
return this._onigLibPromise;
}
public getOnigLibName(): string {
return this._onigLibName;
}
public findLanguageByExtension(fileExtension: string): string {
for (let i = 0; i < this._languages.length; i++) {
let language = this._languages[i];
if (!language.extensions) {
continue;
}
for (let j = 0; j < language.extensions.length; j++) {
let extension = language.extensions[j];
if (extension === fileExtension) {
return language.id;
}
}
}
return null;
}
public findLanguageByFilename(filename: string): string {
for (let i = 0; i < this._languages.length; i++) {
let language = this._languages[i];
if (!language.filenames) {
continue;
}
for (let j = 0; j < language.filenames.length; j++) {
let lFilename = language.filenames[j];
if (filename === lFilename) {
return language.id;
}
}
}
return null;
}
public findScopeByFilename(filename: string): string {
let language = this.findLanguageByExtension(path.extname(filename)) || this.findLanguageByFilename(filename);
if (language) {
let grammar = this.findGrammarByLanguage(language);
if (grammar) {
return grammar.scopeName;
}
}
return null;
}
public findGrammarByLanguage(language: string): IGrammarRegistration {
for (let i = 0; i < this._grammars.length; i++) {
let grammar = this._grammars[i];
if (grammar.language === language) {
return grammar;
}
}
throw new Error('Could not findGrammarByLanguage for ' + language);
}
public loadGrammar(scopeName: string): Thenable<IRawGrammar | null> {
for (let i = 0; i < this._grammars.length; i++) {
let grammar = this._grammars[i];
if (grammar.scopeName === scopeName) {
if (!grammar.grammar) {
grammar.grammar = readGrammarFromPath(grammar.path);
}
return grammar.grammar;
}
}
//console.warn('test resolver: missing grammar for ' + scopeName);
return null;
}
}
function readGrammarFromPath(path: string) : Thenable<IRawGrammar> {
return new Promise((c,e) => {
fs.readFile(path, (error, content) => {
if (error) {
e(error);
} else {
c(parseRawGrammar(content.toString(), path));
}
});
});
}