/******************************************************************************* * Copyright (c) 2007, 2015 Red Hat Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat Incorporated - initial API and implementation * Ed Swartz (Nokia) - refactoring *******************************************************************************/ package org.eclipse.cdt.autotools.ui.editors; import org.eclipse.cdt.autotools.core.AutotoolsPlugin; import org.eclipse.cdt.autotools.ui.editors.parser.AutoconfMacroElement; import org.eclipse.cdt.autotools.ui.editors.parser.IAutoconfMacroValidator; import org.eclipse.cdt.autotools.ui.editors.parser.InvalidMacroException; import org.eclipse.cdt.autotools.ui.editors.parser.ParseException; import org.eclipse.cdt.internal.autotools.core.AutotoolsPropertyConstants; import org.eclipse.cdt.internal.autotools.ui.preferences.AutotoolsEditorPreferenceConstants; import org.eclipse.cdt.internal.autotools.ui.text.hover.AutoconfPrototype; import org.eclipse.cdt.internal.autotools.ui.text.hover.AutoconfTextHover; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.BadLocationException; /** * Validate a macro call by checking against the stored macro prototypes */ public class AutoconfEditorMacroValidator implements IAutoconfMacroValidator { public final String AUTOCONF_MACRO_ARGS_TOO_FEW = "AutoconfMacroArgsTooFew"; //$NON-NLS-1$ public final String AUTOCONF_MACRO_ARGS_TOO_MANY = "AutoconfMacroArgsTooMany"; //$NON-NLS-1$ private AutoconfEditor fEditor; public AutoconfEditorMacroValidator(AutoconfEditor autoconfEditor) { fEditor = autoconfEditor; } @Override public void validateMacroCall(AutoconfMacroElement macro) throws ParseException, InvalidMacroException { AutoconfPrototype p = AutoconfTextHover.getPrototype(macro.getName(), fEditor); if (p != null) { boolean tooFew = false; boolean tooMany = false; boolean justRight = false; int parms = macro.getParameterCount(); int numPrototypes = p.getNumPrototypes(); int minParms = 0; int maxParms = 0; for (int i = 0; i < numPrototypes; ++i) { if (parms < p.getMinParms(i)) { tooFew = true; minParms = p.getMinParms(i); } else if (parms > p.getMaxParms(i)) { tooMany = true; maxParms = p.getMaxParms(i); } else { justRight = true; break; } } int length = macro.getEndOffset() - macro.getStartOffset(); int start = macro.getStartOffset(); int end = macro.getEndOffset(); int lineNumber = 0; try { lineNumber = macro.getDocument().getLineOfOffset(start); } catch (BadLocationException e) { } if (!justRight) { if (tooFew) { String formatString = AutoconfEditorMessages.getFormattedString(AUTOCONF_MACRO_ARGS_TOO_FEW, AutotoolsPlugin.getDefault().getPreferenceStore().getString(AutotoolsEditorPreferenceConstants.AUTOCONF_VERSION), p.getName(), Integer.toString(minParms)); throw new ParseException( formatString, start, end, lineNumber, 0, length, IMarker.SEVERITY_WARNING); } else if (tooMany) { String formatString = AutoconfEditorMessages.getFormattedString(AUTOCONF_MACRO_ARGS_TOO_MANY, AutotoolsPlugin.getDefault().getPreferenceStore().getString(AutotoolsEditorPreferenceConstants.AUTOCONF_VERSION), p.getName(), Integer.toString(maxParms)); throw new ParseException( formatString, start, end, lineNumber, 0, length, IMarker.SEVERITY_WARNING); } } IProject project = fEditor.getProject(); String acDocVer = AutoconfTextHover.getDefaultAutoconfMacrosVer(); try { String acVer = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOCONF_VERSION); if (acVer != null) acDocVer = acVer; else { // look for compat project properties acVer = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOCONF_VERSION_COMPAT); if (acVer != null) acDocVer = acVer; } } catch (CoreException ce1) { // do nothing } macro.validate(acDocVer); } } }