* import/named rule is used only for .js files - the rule doesn't work correctly with .ts files and ts compiler checks imports in .ts anyway. * fix goog-module-id rule * eslint now reports problems in .d.ts files Change-Id: I95d4c1692f1aabdb460dc2e85a55ac5daae72ef0
		
			
				
	
	
		
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright (C) 2020 The Android Open Source Project
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 * http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
// While we are migrating to typescript, gerrit can have .d.ts files.
 | 
						|
// The option "skipLibCheck" is set to true  In the tsconfig.json.
 | 
						|
// This is required, because we want to skip type checking in node_modules
 | 
						|
// directory - some .d.ts files in 3rd-party modules are incorrect.
 | 
						|
// Unfortunately, this options also excludes our own .d.ts files from type
 | 
						|
// checking. This rule reports all .ts errors in a file as tslint errors.
 | 
						|
 | 
						|
function getMassageTextFromChain(chainNode, prefix) {
 | 
						|
  let nestedMessages = prefix + chainNode.messageText;
 | 
						|
  if (chainNode.next && chainNode.next.length > 0) {
 | 
						|
    nestedMessages += "\n";
 | 
						|
    for (const node of chainNode.next) {
 | 
						|
      nestedMessages +=
 | 
						|
          getMassageTextFromChain(node, prefix + " ");
 | 
						|
      if(!nestedMessages.endsWith('\n')) {
 | 
						|
        nestedMessages += "\n";
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return nestedMessages;
 | 
						|
}
 | 
						|
 | 
						|
function getMessageText(diagnostic) {
 | 
						|
  if (typeof diagnostic.messageText === 'string') {
 | 
						|
    return diagnostic.messageText;
 | 
						|
  }
 | 
						|
  return getMassageTextFromChain(diagnostic.messageText, "");
 | 
						|
}
 | 
						|
 | 
						|
function getDiagnosticStartAndEnd(diagnostic) {
 | 
						|
  if(diagnostic.start) {
 | 
						|
    const file = diagnostic.file;
 | 
						|
    const start = file.getLineAndCharacterOfPosition(diagnostic.start);
 | 
						|
    const length = diagnostic.length ? diagnostic.length : 0;
 | 
						|
    return {
 | 
						|
      start,
 | 
						|
      end: file.getLineAndCharacterOfPosition(diagnostic.start + length),
 | 
						|
    };
 | 
						|
  }
 | 
						|
  return {
 | 
						|
    start: {line:0, character: 0},
 | 
						|
    end: {line:0, character: 0},
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  meta: {
 | 
						|
    type: "problem",
 | 
						|
    docs: {
 | 
						|
      description: "Reports all typescript problems as linter problems",
 | 
						|
      category: ".d.ts",
 | 
						|
      recommended: false
 | 
						|
    },
 | 
						|
    schema: [],
 | 
						|
  },
 | 
						|
  create: function (context) {
 | 
						|
    const program = context.parserServices.program;
 | 
						|
    return {
 | 
						|
      Program: function(node) {
 | 
						|
        const sourceFile =
 | 
						|
            context.parserServices.esTreeNodeToTSNodeMap.get(node);
 | 
						|
        const allDiagnostics = [
 | 
						|
            ...program.getDeclarationDiagnostics(sourceFile),
 | 
						|
            ...program.getSemanticDiagnostics(sourceFile)];
 | 
						|
        for(const diagnostic of allDiagnostics) {
 | 
						|
          const {start, end } = getDiagnosticStartAndEnd(diagnostic);
 | 
						|
          context.report({
 | 
						|
            message: getMessageText(diagnostic),
 | 
						|
            loc: {
 | 
						|
              start: {
 | 
						|
                line: start.line + 1,
 | 
						|
                column: start.character,
 | 
						|
              },
 | 
						|
              end: {
 | 
						|
                line: end.line + 1,
 | 
						|
                column: end.character,
 | 
						|
              }
 | 
						|
            }
 | 
						|
          });
 | 
						|
        }
 | 
						|
      },
 | 
						|
    };
 | 
						|
  }
 | 
						|
};
 |