This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit ad79c406bff1360bae250304154c2e0eaa9d9263 Author: Josh Tynjala <joshtynj...@apache.org> AuthorDate: Mon Sep 26 13:47:16 2022 -0700 linter: sparse-array --- .../main/java/org/apache/royale/linter/LINTER.java | 4 ++ .../apache/royale/linter/config/Configuration.java | 16 +++++ .../royale/linter/rules/SparseArrayRule.java | 75 ++++++++++++++++++++++ 3 files changed, 95 insertions(+) diff --git a/linter/src/main/java/org/apache/royale/linter/LINTER.java b/linter/src/main/java/org/apache/royale/linter/LINTER.java index 03d6c0549..e8ca277ea 100644 --- a/linter/src/main/java/org/apache/royale/linter/LINTER.java +++ b/linter/src/main/java/org/apache/royale/linter/LINTER.java @@ -79,6 +79,7 @@ import org.apache.royale.linter.rules.MissingTypeRule; import org.apache.royale.linter.rules.NumericLeadingZeroesRule; import org.apache.royale.linter.rules.OverrideContainsOnlySuperCallRule; import org.apache.royale.linter.rules.PackageNameRule; +import org.apache.royale.linter.rules.SparseArrayRule; import org.apache.royale.linter.rules.StaticConstantsRule; import org.apache.royale.linter.rules.StrictEqualityRule; import org.apache.royale.linter.rules.StringEventNameRule; @@ -347,6 +348,9 @@ public class LINTER { if (configuration.getPackageName()) { rules.add(new PackageNameRule()); } + if (configuration.getSparseArray()) { + rules.add(new SparseArrayRule()); + } if (configuration.getStaticConstants()) { rules.add(new StaticConstantsRule()); } diff --git a/linter/src/main/java/org/apache/royale/linter/config/Configuration.java b/linter/src/main/java/org/apache/royale/linter/config/Configuration.java index 7aac037d7..0e02a0e95 100644 --- a/linter/src/main/java/org/apache/royale/linter/config/Configuration.java +++ b/linter/src/main/java/org/apache/royale/linter/config/Configuration.java @@ -714,6 +714,22 @@ public class Configuration { this.packageName = b; } + // + // 'sparse-array' option + // + + private boolean sparseArray = false; + + public boolean getSparseArray() { + return sparseArray; + } + + @Config + @Mapping("sparse-array") + public void setSparseArray(ConfigurationValue cv, boolean b) { + this.sparseArray = b; + } + // // 'static-constants' option // diff --git a/linter/src/main/java/org/apache/royale/linter/rules/SparseArrayRule.java b/linter/src/main/java/org/apache/royale/linter/rules/SparseArrayRule.java new file mode 100644 index 000000000..a6a723684 --- /dev/null +++ b/linter/src/main/java/org/apache/royale/linter/rules/SparseArrayRule.java @@ -0,0 +1,75 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You 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. +// +//////////////////////////////////////////////////////////////////////////////// + +package org.apache.royale.linter.rules; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.apache.royale.compiler.internal.tree.as.ContainerNode; +import org.apache.royale.compiler.problems.CompilerProblem; +import org.apache.royale.compiler.problems.ICompilerProblem; +import org.apache.royale.compiler.tree.ASTNodeID; +import org.apache.royale.compiler.tree.as.IASNode; +import org.apache.royale.compiler.tree.as.ILiteralContainerNode; +import org.apache.royale.compiler.tree.as.ILiteralNode.LiteralType; +import org.apache.royale.linter.LinterRule; +import org.apache.royale.linter.NodeVisitor; +import org.apache.royale.linter.TokenQuery; + +/** + * Check that an array literal contains no empty slots (multiple repeating commas with no values). + */ +public class SparseArrayRule extends LinterRule { + @Override + public Map<ASTNodeID, NodeVisitor> getNodeVisitors() { + Map<ASTNodeID, NodeVisitor> result = new HashMap<>(); + result.put(ASTNodeID.ArrayLiteralID, (node, tokenQuery, problems) -> { + checkLiteralContainerNode((ILiteralContainerNode) node, tokenQuery, problems); + }); + return result; + } + + private void checkLiteralContainerNode(ILiteralContainerNode arrayLiteralNode, TokenQuery tokenQuery, Collection<ICompilerProblem> problems) { + if (!LiteralType.ARRAY.equals(arrayLiteralNode.getLiteralType())) { + return; + } + ContainerNode contentsNode = arrayLiteralNode.getContentsNode(); + if (contentsNode == null) { + return; + } + for (int i = 0; i < contentsNode.getChildCount(); i++) { + IASNode child = contentsNode.getChild(i); + if (ASTNodeID.NilID.equals(child.getNodeID())) { + problems.add(new SparseArrayLinterProblem(arrayLiteralNode)); + return; + } + } + } + + public static class SparseArrayLinterProblem extends CompilerProblem { + public static final String DESCRIPTION = "Array literals must not be sparse"; + + public SparseArrayLinterProblem(ILiteralContainerNode node) + { + super(node); + } + } +}