@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
263 lines (262 loc) • 24.7 kB
TypeScript
import type { LintingRule } from './linter-format';
/**
* The registry of currently supported linting rules.
* A linting rule can be executed on a dataflow pipeline result using {@link executeLintingRule}.
*/
export declare const LintingRules: {
readonly 'deprecated-functions': {
readonly createSearch: (config: import("./rules/deprecated-functions").DeprecatedFunctionsConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "filter"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, [] | import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>) => {
results: {
certainty: import("./linter-format").LintingResultCertainty.Certain;
function: import("../dataflow/environments/identifier").Identifier;
range: import("../util/range").SourceRange;
}[];
'.meta': import("./rules/deprecated-functions").DeprecatedFunctionsMetadata;
};
readonly prettyPrint: {
readonly query: (result: import("./rules/deprecated-functions").DeprecatedFunctionsResult) => string;
readonly full: (result: import("./rules/deprecated-functions").DeprecatedFunctionsResult) => string;
};
readonly info: {
readonly name: "Deprecated Functions";
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Deprecated, import("./linter-tags").LintingRuleTag.Smell, import("./linter-tags").LintingRuleTag.Usability, import("./linter-tags").LintingRuleTag.Reproducibility];
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly description: "Marks deprecated functions that should not be used anymore.";
readonly defaultConfig: {
readonly deprecatedFunctions: readonly ["all_equal", "arrange_all", "distinct_all", "filter_all", "group_by_all", "summarise_all", "mutate_all", "select_all", "vars", "all_vars", "id", "failwith", "select_vars", "rename_vars", "select_var", "current_vars", "bench_tbls", "compare_tbls", "compare_tbls2", "eval_tbls", "eval_tbls2", "location", "changes", "combine", "do", "funs", "add_count_", "add_tally_", "arrange_", "count_", "distinct_", "do_", "filter_", "funs_", "group_by_", "group_indices_", "mutate_", "tally_", "transmute_", "rename_", "rename_vars_", "select_", "select_vars_", "slice_", "summarise_", "summarize_", "summarise_each", "src_local", "tbl_df", "add_rownames", "group_nest", "group_split", "with_groups", "nest_by", "progress_estimated", "recode", "sample_n", "top_n", "transmute", "fct_explicit_na", "aes_", "aes_auto", "annotation_logticks", "is.Coord", "coord_flip", "coord_map", "is.facet", "fortify", "is.ggproto", "guide_train", "is.ggplot", "qplot", "is.theme", "gg_dep", "liply", "isplit2", "list_along", "cross", "invoke", "at_depth", "prepend", "rerun", "splice", "`%@%`", "rbernoulli", "rdunif", "when", "update_list", "map_raw", "accumulate", "reduce_right", "flatten", "map_dfr", "as_vector", "transpose", "melt_delim", "melt_fwf", "melt_table", "read_table2", "str_interp", "as_tibble", "data_frame", "tibble_", "data_frame_", "lst_", "as_data_frame", "as.tibble", "frame_data", "trunc_mat", "is.tibble", "tidy_names", "set_tidy_names", "repair_names", "extract_numeric", "complete_", "drop_na_", "expand_", "crossing_", "nesting_", "extract_", "fill_", "gather_", "nest_", "separate_rows_", "separate_", "spread_", "unite_", "unnest_", "extract", "gather", "nest_legacy", "separate_rows", "separate", "spread"];
};
};
};
readonly 'file-path-validity': {
readonly createSearch: (config: import("./rules/file-path-validity").FilePathValidityConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"from-query", ["with"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: import("./rules/file-path-validity").FilePathValidityConfig, data: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: import("./rules/file-path-validity").FilePathValidityResult[];
".meta": import("./rules/file-path-validity").FilePathValidityMetadata;
};
readonly info: {
readonly name: "File Path Validity";
readonly description: "Checks whether file paths used in read and write operations are valid and point to existing files.";
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Robustness, import("./linter-tags").LintingRuleTag.Reproducibility, import("./linter-tags").LintingRuleTag.Bug];
readonly defaultConfig: {
readonly additionalReadFunctions: readonly [];
readonly additionalWriteFunctions: readonly [];
readonly includeUnknown: false;
};
};
readonly prettyPrint: {
readonly query: (result: import("./rules/file-path-validity").FilePathValidityResult) => string;
readonly full: (result: import("./rules/file-path-validity").FilePathValidityResult) => string;
};
};
readonly 'seeded-randomness': {
readonly createSearch: (config: import("./rules/seeded-randomness").SeededRandomnessConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "filter", "with"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: import("./rules/seeded-randomness").SeededRandomnessConfig, { dataflow }: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: {
certainty: import("./linter-format").LintingResultCertainty.Certain;
function: import("../dataflow/environments/identifier").Identifier;
range: import("../util/range").SourceRange;
}[];
'.meta': import("./rules/seeded-randomness").SeededRandomnessMeta;
};
readonly info: {
readonly defaultConfig: {
readonly randomnessProducers: readonly [{
readonly type: "function";
readonly name: "set.seed";
}, {
readonly type: "assignment";
readonly name: ".Random.seed";
}];
readonly randomnessConsumers: readonly ["jitter", "sample", "sample.int", "arima.sim", "kmeans", "princomp", "rcauchy", "rchisq", "rexp", "rgamma", "rgeom", "rlnorm", "rlogis", "rmultinom", "rnbinom", "rnorm", "rpois", "runif", "pointLabel", "some", "rbernoulli", "rdunif", "generateSeedVectors"];
};
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Robustness, import("./linter-tags").LintingRuleTag.Reproducibility];
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly name: "Seeded Randomness";
readonly description: "Checks whether randomness-based function calls are preceded by a random seed generation function. For consistent reproducibility, functions that use randomness should only be called after a constant random seed is set using a function like `set.seed`.";
};
readonly prettyPrint: {
readonly query: (result: import("./rules/seeded-randomness").SeededRandomnessResult, _meta: import("./rules/seeded-randomness").SeededRandomnessMeta) => string;
readonly full: (result: import("./rules/seeded-randomness").SeededRandomnessResult, _meta: import("./rules/seeded-randomness").SeededRandomnessMeta) => string;
};
};
readonly 'absolute-file-paths': {
readonly createSearch: (config: import("./rules/absolute-path").AbsoluteFilePathConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"from-query", ["unique"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: import("./rules/absolute-path").AbsoluteFilePathConfig, data: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: import("./rules/absolute-path").AbsoluteFilePathResult[];
".meta": import("./rules/absolute-path").AbsoluteFilePathMetadata;
};
readonly prettyPrint: {
readonly query: (result: import("./rules/absolute-path").AbsoluteFilePathResult) => string;
readonly full: (result: import("./rules/absolute-path").AbsoluteFilePathResult) => string;
};
readonly info: {
readonly name: "Absolute Paths";
readonly description: "Checks whether file paths are absolute.";
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Robustness, import("./linter-tags").LintingRuleTag.Reproducibility, import("./linter-tags").LintingRuleTag.Smell, import("./linter-tags").LintingRuleTag.QuickFix];
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly defaultConfig: {
readonly include: {
readonly constructed: true;
readonly allStrings: false;
};
readonly additionalPathFunctions: readonly [];
readonly absolutePathRegex: undefined;
readonly useAsWd: "@script";
};
};
};
readonly 'unused-definitions': {
readonly createSearch: (config: import("./rules/unused-definition").UnusedDefinitionConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["filter"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, [] | import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: import("./rules/unused-definition").UnusedDefinitionConfig, data: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: import("./rules/unused-definition").UnusedDefinitionResult[];
".meta": import("./rules/unused-definition").UnusedDefinitionMetadata;
};
readonly prettyPrint: {
readonly query: (result: import("./rules/unused-definition").UnusedDefinitionResult) => string;
readonly full: (result: import("./rules/unused-definition").UnusedDefinitionResult) => string;
};
readonly info: {
readonly name: "Unused Definitions";
readonly description: "Checks for unused definitions.";
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Readability, import("./linter-tags").LintingRuleTag.Smell, import("./linter-tags").LintingRuleTag.QuickFix];
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly defaultConfig: {
readonly includeFunctionDefinitions: true;
};
};
};
readonly 'naming-convention': {
readonly createSearch: (_config: import("./rules/naming-convention").NamingConventionConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["filter"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, [] | import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: import("./rules/naming-convention").NamingConventionConfig, data: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: {
quickFix: import("./linter-format").LintQuickFixReplacement[] | undefined;
certainty: import("./linter-format").LintingResultCertainty;
detectedCasing: import("./rules/naming-convention").CasingConvention;
name: string;
range: import("../util/range").SourceRange;
}[];
'.meta': {
numMatches: number;
numBreak: number;
};
};
readonly prettyPrint: {
readonly query: (result: import("./rules/naming-convention").NamingConventionResult) => string;
readonly full: (result: import("./rules/naming-convention").NamingConventionResult) => string;
};
readonly info: {
readonly name: "Naming Convention";
readonly certainty: import("./linter-format").LintingRuleCertainty.OverApproximative;
readonly description: "Checks wether the symbols conform to a certain naming convention";
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Style, import("./linter-tags").LintingRuleTag.QuickFix];
readonly defaultConfig: {
readonly caseing: "auto";
};
};
};
readonly 'dataframe-access-validation': {
readonly createSearch: () => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: import("./rules/dataframe-access-validation").DataFrameAccessValidationConfig, data: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: import("./rules/dataframe-access-validation").DataFrameAccessValidationResult[];
'.meta': import("./rules/dataframe-access-validation").DataFrameAccessValidationMetadata;
};
readonly prettyPrint: {
readonly query: (result: import("./rules/dataframe-access-validation").DataFrameAccessValidationResult) => string;
readonly full: (result: import("./rules/dataframe-access-validation").DataFrameAccessValidationResult) => string;
};
readonly info: {
readonly name: "Dataframe Access Validation";
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Bug, import("./linter-tags").LintingRuleTag.Usability, import("./linter-tags").LintingRuleTag.Reproducibility];
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly description: "Validates the existance of accessed columns and rows of dataframes.";
readonly defaultConfig: {
readonly readLoadedData: false;
};
};
};
readonly 'dead-code': {
readonly createSearch: (config: import("./rules/dead-code").DeadCodeConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, _config: import("./rules/dead-code").DeadCodeConfig, _data: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: {
certainty: import("./linter-format").LintingResultCertainty.Certain;
range: import("../util/range").SourceRange;
}[];
'.meta': import("./rules/dead-code").DeadCodeMetadata;
};
readonly prettyPrint: {
readonly query: (result: import("./rules/dead-code").DeadCodeResult) => string;
readonly full: (result: import("./rules/dead-code").DeadCodeResult) => string;
};
readonly info: {
readonly name: "Dead Code";
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Smell, import("./linter-tags").LintingRuleTag.Usability, import("./linter-tags").LintingRuleTag.Reproducibility];
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly description: "Marks areas of code that are never reached during execution.";
readonly defaultConfig: {};
};
};
readonly 'useless-loop': {
readonly createSearch: () => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["filter"], import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, [] | import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
readonly processSearchResult: (elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: import("./rules/useless-loop").UselessLoopConfig, data: {
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
dataflow: import("../dataflow/info").DataflowInformation;
config: import("../config").FlowrConfigOptions;
}) => {
results: {
certainty: import("./linter-format").LintingResultCertainty.Certain;
name: string;
range: import("../util/range").SourceRange;
}[];
'.meta': {
numOfUselessLoops: number;
};
};
readonly prettyPrint: {
readonly query: (result: import("./rules/useless-loop").UselessLoopResult) => string;
readonly full: (result: import("./rules/useless-loop").UselessLoopResult) => string;
};
readonly info: {
readonly name: "Useless Loops";
readonly description: "Detect loops which only iterate once";
readonly certainty: import("./linter-format").LintingRuleCertainty.BestEffort;
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Smell, import("./linter-tags").LintingRuleTag.Readability];
readonly defaultConfig: {
readonly loopyFunctions: Set<"builtin:default" | "builtin:eval" | "builtin:apply" | "builtin:expression-list" | "builtin:source" | "builtin:access" | "builtin:if-then-else" | "builtin:get" | "builtin:rm" | "builtin:library" | "builtin:assignment" | "builtin:special-bin-op" | "builtin:pipe" | "builtin:function-definition" | "builtin:quote" | "builtin:for-loop" | "builtin:repeat-loop" | "builtin:while-loop" | "builtin:replacement" | "builtin:list" | "builtin:vector">;
};
};
};
};
export type LintingRuleNames = keyof typeof LintingRules;
export type LintingRuleMetadata<Name extends LintingRuleNames> = typeof LintingRules[Name] extends LintingRule<infer _Result, infer Metadata, infer _Config, infer _Info, infer _Elements> ? Metadata : never;
export type LintingRuleResult<Name extends LintingRuleNames> = typeof LintingRules[Name] extends LintingRule<infer Result, infer _Metadata, infer _Config, infer _Info, infer _Elements> ? Result : never;
export type LintingRuleConfig<Name extends LintingRuleNames> = typeof LintingRules[Name] extends LintingRule<infer _Result, infer _Metadata, infer Config, infer _Info, infer _Elements> ? Config : never;