////////////////////////////////////////////////////////////////////////////////
//
//  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.common.ISourceLocation;
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.INumericLiteralNode;
import org.apache.royale.linter.LinterRule;
import org.apache.royale.linter.NodeVisitor;
import org.apache.royale.linter.TokenQuery;
import org.apache.royale.linter.problems.ILinterProblem;

/**
 * Checks for use of numeric literals with leading zeroes, except when it starts
 * with '0x' (hexadecimal notation). '0123' is not allowed. '0x123' is allowed.
 * 
 * Designed to prevent confusion with ECMAScript's deprecated octal notation.
 */
public class NoLeadingZeroesRule extends LinterRule {
	@Override
	public Map<ASTNodeID, NodeVisitor> getNodeVisitors() {
		Map<ASTNodeID, NodeVisitor> result = new HashMap<>();
		result.put(ASTNodeID.LiteralIntegerID, (node, tokenQuery, problems) -> {
			checkNumericLiteralNode((INumericLiteralNode) node, tokenQuery, problems);
		});
		result.put(ASTNodeID.LiteralNumberID, (node, tokenQuery, problems) -> {
			checkNumericLiteralNode((INumericLiteralNode) node, tokenQuery, problems);
		});
		result.put(ASTNodeID.LiteralUintID, (node, tokenQuery, problems) -> {
			checkNumericLiteralNode((INumericLiteralNode) node, tokenQuery, problems);
		});
		return result;
	}

	private void checkNumericLiteralNode(INumericLiteralNode numberNode, TokenQuery tokenQuery, Collection<ICompilerProblem> problems) {
		String stringValue = numberNode.getNumericValue().toString();
		if (!stringValue.startsWith("0")) {
			return;
		}
		if (stringValue.startsWith("0x")) {
			return;
		}
		problems.add(new NoLeadingZeroesLinterProblem(numberNode));
	}

	public static class NoLeadingZeroesLinterProblem extends CompilerProblem implements ILinterProblem {
		public static final String DESCRIPTION = "Must remove leading zeros from numeric literal '${value}'";

		public NoLeadingZeroesLinterProblem(INumericLiteralNode node)
		{
			super((ISourceLocation) node);
			value = node.getNumericValue().toString();
		}

		public String value;
	}
}
