From 317a828a2fd4fb2ea2072fb50f7dc161a36584d3 Mon Sep 17 00:00:00 2001
From: Pierre-Marie
Date: Sat, 3 Feb 2018 10:40:45 -0800
Subject: [PATCH] Close gaps in scope and linter tests
---
types/eslint/eslint-tests.ts | 103 +++++++++++++++++++++++++++++++----
types/eslint/index.d.ts | 2 +-
2 files changed, 92 insertions(+), 13 deletions(-)
diff --git a/types/eslint/eslint-tests.ts b/types/eslint/eslint-tests.ts
index 5f15b21039..57a58d475e 100644
--- a/types/eslint/eslint-tests.ts
+++ b/types/eslint/eslint-tests.ts
@@ -1,5 +1,5 @@
import { Comment } from 'estree';
-import { AST, SourceCode, Rule, Linter, CLIEngine, RuleTester } from 'eslint';
+import { AST, SourceCode, Rule, Linter, CLIEngine, RuleTester, Scope } from 'eslint';
const SOURCE = `var foo = bar;`;
@@ -38,7 +38,7 @@ const COMMENT: Comment = {
//#region SourceCode
-const sourceCode = new SourceCode(SOURCE, AST);
+let sourceCode = new SourceCode(SOURCE, AST);
SourceCode.splitLines(SOURCE);
@@ -210,6 +210,48 @@ sourceCode.getCommentsInside(AST);
//#endregion
+//#region Scope
+
+const scopeManager: Scope.ScopeManager = {
+ scopes: [],
+ globalScope: null,
+ acquire(node, inner) {
+ return this.scopes[0];
+ },
+ getDeclaredVariables() {
+ return [];
+ }
+};
+
+const scope = scopeManager.scopes[0];
+
+const variable = scope.variables[0];
+
+variable.name = 'foo';
+
+variable.identifiers[0].type = 'Identifier';
+
+variable.defs[0].name.type = 'Identifier';
+variable.defs[0].type;
+variable.defs[0].node;
+variable.defs[0].parent;
+
+const reference = scope.references[0];
+
+reference.from = scope;
+reference.identifier.type = 'Identifier';
+reference.resolved = variable;
+reference.writeExpr = AST;
+reference.init = true;
+
+reference.isRead();
+reference.isReadOnly();
+reference.isWrite();
+reference.isWriteOnly();
+reference.isReadWrite();
+
+//#endregion
+
//#region Rule
let rule: Rule.RuleModule;
@@ -326,27 +368,64 @@ linter.verify(SOURCE, { rules: { 'no-console': 'error' } }, 'test.js');
linter.verify(SOURCE, { rules: { 'no-console': 'warn' } }, 'test.js');
linter.verify(SOURCE, { rules: { 'no-console': 'off' } }, 'test.js');
+const lintingResult = linter.verify(SOURCE, {});
+
+for (const msg of lintingResult) {
+ msg.severity = 1;
+ msg.severity = 2;
+
+ msg.ruleId = 'foo';
+
+ msg.fatal = true;
+
+ msg.line = 0;
+ msg.endLine = 0;
+ msg.column = 0;
+ msg.endColumn = 0;
+
+ msg.source = SOURCE;
+
+ if (msg.fix) {
+ msg.fix.text = 'foo';
+ msg.fix.range = [0, 0];
+ }
+}
+
linter.verifyAndFix(SOURCE, {});
linter.verifyAndFix(SOURCE, {}, 'test.js');
linter.verifyAndFix(SOURCE, {}, { fix: false });
-linter.getSourceCode();
+const fixResult = linter.verifyAndFix(SOURCE, {});
-// TODO: Fix me
-linter.defineRule('test', {
- create() => {},
-});
+fixResult.fixed = true;
+fixResult.output = 'foo';
+
+for (const msg of fixResult.messages) {
+ msg.ruleId = 'foo';
+}
+
+sourceCode = linter.getSourceCode();
+
+linter.defineRule('test', rule);
-// TODO: Fix me
linter.defineRules({
- 'test': { create() => {} },
- 'test-2': { create() => {} },
+ foo: rule,
+ bar: rule,
});
linter.getRules();
-// TODO: Fix me
-linter.defineParser('cutom-parser', );
+linter.defineParser('custom-parser', { parse: (src, opts) => AST });
+linter.defineParser('custom-parser', {
+ parseForESLint(src, opts) {
+ return {
+ ast: AST,
+ visitorKeys: {},
+ parserServices: {},
+ scopeManager,
+ };
+ }
+});
//#endregion
diff --git a/types/eslint/index.d.ts b/types/eslint/index.d.ts
index 26f2452fe2..4ba910329c 100644
--- a/types/eslint/index.d.ts
+++ b/types/eslint/index.d.ts
@@ -69,7 +69,7 @@ export namespace Scope {
interface Variable {
name: string;
- identifiers: ESTree.Identifier;
+ identifiers: ESTree.Identifier[];
references: Reference[];
defs: Definition[];
}