/*
* Copyright 2011 Google Inc.
*
* 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.
*/
package com.google.template.soy.passes;
import com.google.template.soy.error.ErrorReporter;
import com.google.template.soy.error.SoyErrorKind;
import com.google.template.soy.soytree.AbstractSoyNodeVisitor;
import com.google.template.soy.soytree.CallNode;
import com.google.template.soy.soytree.MsgPlaceholderNode;
import com.google.template.soy.soytree.PrintNode;
import com.google.template.soy.soytree.SoyNode;
import com.google.template.soy.soytree.SoyNode.MsgPlaceholderInitialNode;
import com.google.template.soy.soytree.SoyNode.ParentSoyNode;
/**
* Visitor to verify that all occurrences of the 'phname' attribute are on message placeholders.
*
* <p>Note: Doesn't check HTML tags since we don't parse HTML tags outside of messages anyway. Only
* checks PrintNode and CallNode.
*
*/
public final class VerifyPhnameAttrOnlyOnPlaceholdersVisitor extends AbstractSoyNodeVisitor<Void> {
private static final SoyErrorKind INVALID_PLACEHOLDER =
SoyErrorKind.of("''phname'' attributes are only valid inside '''{'msg...'' tags");
private final ErrorReporter errorReporter;
public VerifyPhnameAttrOnlyOnPlaceholdersVisitor(ErrorReporter errorReporter) {
this.errorReporter = errorReporter;
}
@Override
protected void visitPrintNode(PrintNode node) {
visitMsgPlaceholderInitialContentNodeHelper(node);
}
@Override
protected void visitCallNode(CallNode node) {
visitMsgPlaceholderInitialContentNodeHelper(node);
visitChildren(node);
}
private void visitMsgPlaceholderInitialContentNodeHelper(MsgPlaceholderInitialNode node) {
if (node.getUserSuppliedPhName() != null && !(node.getParent() instanceof MsgPlaceholderNode)) {
errorReporter.report(node.getSourceLocation(), INVALID_PLACEHOLDER);
}
}
@Override
protected void visitSoyNode(SoyNode node) {
if (node instanceof ParentSoyNode<?>) {
visitChildren((ParentSoyNode<?>) node);
}
}
}