/******************************************************************************* * Copyright © 2011, 2013 IBM 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: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.compiler.internal.core.validation.statement; import org.eclipse.edt.compiler.binding.IPartBinding; import org.eclipse.edt.compiler.core.ast.DefaultASTVisitor; import org.eclipse.edt.compiler.core.ast.SetStatement; import org.eclipse.edt.compiler.internal.core.builder.IProblemRequestor; import org.eclipse.edt.compiler.internal.core.lookup.ICompilerOptions; public class SetStatementValidator extends DefaultASTVisitor { // private static final String POSITION_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_POSITION); // private static final String ALARM_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_ALARM); // private static final String CURSOR_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_CURSOR); // private static final String FULL_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_FULL); // private static final String NOHIGHLIGHT_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_NOHIGHLIGHT); // private static final String BLINK_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_BLINK); // private static final String REVERSE_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_REVERSE); // private static final String UNDERLINE_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_UNDERLINE); // private static final String MODIFIED_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_MODIFIED); // private static final String DEFAULTCOLOR_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_DEFAULTCOLOR); // private static final String BLACK_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_BLACK); // private static final String BLUE_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_BLUE); // private static final String GREEN_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_GREEN); // private static final String MAGENTA_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_MAGENTA); // private static final String RED_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_RED); // private static final String CYAN_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_CYAN); // private static final String YELLOW_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_YELLOW); // private static final String WHITE_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_WHITE); // private static final String BOLD_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_BOLD); // private static final String DIM_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_DIM); // private static final String MASKED_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_MASKED); // private static final String INVISIBLE_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_INVISIBLE); // private static final String NORMALINTENSITY_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_NORMALINTENSITY); // private static final String PROTECT_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_PROTECT); // private static final String SKIP_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_SKIP); // private static final String UNPROTECT_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_UNPROTECT); // private static final String NORMAL_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_NORMAL); // private static final String INITIALATTRIBUTES_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_INITIALATTRIBUTES); // private static final String INITIAL_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_INITIAL); // private static final String EMPTY_INTERN = InternUtil.intern(IEGLConstants.MNEMONIC_EMPTY); // // private String sColor;// defaultColor, black, blue, green, magenta, red, cyan, yellow, white // private String sIntensity; // bold, invisible, normalIntensity, dim, masked // private String sProtection; // protect, skip, unprotect // // note that initial is in both of these categories // private String sDefaultTextFieldState; // normal, initial, initialAttributes // private String sEmptyOrInitial; // empty, initial // // private String sNoHighlightState; //nohighlight // //can't have nohighlight with any of the following three // private String sBlinkState; // blink // private String sReverseState; // reverse // private String sUnderlineState; // underline // // // can't have any defaultTextFieldState with // // any of: modified, color, intensity, protection, nohighlight, blink, reverse, underline // private String sModifiedState; //modified // // // no rules on these except can't duplicate // private boolean positionState; // position // private boolean alarmState; // alarm // private boolean cursorState; // cursor // private boolean fullState; // full private IProblemRequestor problemRequestor; private ICompilerOptions compilerOptions; public SetStatementValidator(IProblemRequestor problemRequestor, IPartBinding enclosingPart, ICompilerOptions compilerOptions) { this.problemRequestor = problemRequestor; this.compilerOptions = compilerOptions; } public boolean visit(final SetStatement setStatement) { if (true) { problemRequestor.acceptProblem(setStatement, IProblemRequestor.STATEMENT_NOT_SUPPORTED, new String[] {"SET"}); return false; } // checkForDuplicateStates(setStatement); // checkForConflictingStates(setStatement); // if(!checkNoSubstringAsTarget(setStatement)) { // return false; // } // validateReferenceAndStates(setStatement); return false; } // protected void checkForDuplicateStates(SetStatement setStmt){ // Iterator iterator = setStmt.getStates().iterator(); // // while (iterator.hasNext()) { // String result = InternUtil.intern((String) iterator.next()); // // if (result == POSITION_INTERN) { // if (!positionState) { // positionState = true; // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_POSITION.toUpperCase()}); // } // } else if (result == ALARM_INTERN) { // if (!alarmState) { // alarmState = true; // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_ALARM.toUpperCase()}); // } // } else if (result == CURSOR_INTERN) { // if (!cursorState ) { // cursorState = true; // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_CURSOR.toUpperCase()}); // } // } else if (result == FULL_INTERN) { // if (!fullState) { // fullState = true; // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_FULL.toUpperCase()}); // } // } else if (result == NOHIGHLIGHT_INTERN) { // if (sNoHighlightState == null) { // sNoHighlightState = result.toUpperCase(); // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_NOHIGHLIGHT.toUpperCase()}); // } // } else if (result == BLINK_INTERN) { // if (sBlinkState == null) { // sBlinkState = result.toUpperCase(); // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_BLINK.toUpperCase()}); // } // } else if (result == REVERSE_INTERN) { // if (sReverseState == null) { // sReverseState = result.toUpperCase(); // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_REVERSE.toUpperCase()}); // } // } else if (result == UNDERLINE_INTERN) { // if (sUnderlineState == null) { // sUnderlineState = result.toUpperCase(); // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_UNDERLINE.toUpperCase()}); // } // } else if (result == MODIFIED_INTERN) { // if (sModifiedState == null) { // sModifiedState = result.toUpperCase(); // } else { //duplicate // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.DUPE_STATE_ON_SET, // new String[] { IEGLConstants.MNEMONIC_MODIFIED.toUpperCase()}); // } // } else if ( // result == DEFAULTCOLOR_INTERN // || result == BLACK_INTERN // || result == BLUE_INTERN // || result == GREEN_INTERN // || result == MAGENTA_INTERN // || result == RED_INTERN // || result == CYAN_INTERN // || result == YELLOW_INTERN // || result == WHITE_INTERN) { // if (sColor == null) { // sColor = result.toUpperCase(); // } else { //multiple colors // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.MULTIPLE_COLORS_ON_SET, // new String[] { sColor,result.toUpperCase()}); // } // } else if ( // result == BOLD_INTERN // || result == DIM_INTERN // || result == MASKED_INTERN // || result == INVISIBLE_INTERN // || result == NORMALINTENSITY_INTERN) { // if (sIntensity == null) { // sIntensity = result.toUpperCase(); // } else { //multiple intensity states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.MULTIPLE_INTENSITY_ON_SET, // new String[] { sIntensity,result.toUpperCase()}); // } // } else if ( // result == PROTECT_INTERN // || result == SKIP_INTERN // || result == UNPROTECT_INTERN) { // if (sProtection == null) { // sProtection = result.toUpperCase(); // } else { //multiple protection states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.MULTIPLE_PROTECTION_ON_SET, // new String[] { sProtection,result.toUpperCase()}); // } // } else if ( // result == NORMAL_INTERN // || result == INITIALATTRIBUTES_INTERN // || result == INITIAL_INTERN) { // if (sDefaultTextFieldState == null) { // sDefaultTextFieldState = result.toUpperCase(); // } else { //multiple text field states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.MULTIPLE_TEXT_FIELD_STATE_ON_SET, // new String[] { sDefaultTextFieldState,result.toUpperCase()}); // } // if (result == INITIAL_INTERN) { // if (sEmptyOrInitial == null) { // sEmptyOrInitial = result.toUpperCase(); // } else { //multiple empty or initial states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.EMPTY_AND_INITIAL_ON_SET, // new String[] { sEmptyOrInitial,result.toUpperCase()}); // } // } // } else if (result == EMPTY_INTERN) { // if (sEmptyOrInitial == null) { // sEmptyOrInitial = result.toUpperCase(); // } else { //multiple empty or initial states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.EMPTY_AND_INITIAL_ON_SET, // new String[] { sEmptyOrInitial,result.toUpperCase()}); // } // } else { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.UNSUPPORTED_STATE_ON_SET, // new String[] { result.toUpperCase()}); // // } // } // end while loop // } // // // protected void checkForConflictingStates(SetStatement setStmt ) { // if (sNoHighlightState != null && sBlinkState != null) { //multiple highlighting states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.MULTIPLE_HIGHLIGHT_STATE_ON_SET, // new String[] {sNoHighlightState, sBlinkState}); // } // if (sNoHighlightState != null && sReverseState != null) { //multiple highlighting states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.MULTIPLE_HIGHLIGHT_STATE_ON_SET, // new String[] {sNoHighlightState, sReverseState}); // } // if (sNoHighlightState != null && sUnderlineState != null) { //multiple highlighting states // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.MULTIPLE_HIGHLIGHT_STATE_ON_SET, // new String[] {sNoHighlightState, sUnderlineState}); // } // // // can't have any defaultTextFieldState with // // any of: modified, color, intensity, protection, nohighlight, blink, reverse, underline // if (sDefaultTextFieldState != null) { // if (sModifiedState != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sModifiedState}); // } // // if (sColor != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sColor}); // } // if (sIntensity != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sIntensity}); // } // if (sProtection != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sProtection}); // } // if (sNoHighlightState != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sNoHighlightState}); // } // // if (sBlinkState != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sBlinkState}); // } // if (sReverseState != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sReverseState}); // } // if (sUnderlineState != null) { // problemRequestor.acceptProblem(setStmt, // IProblemRequestor.TEXT_FIELD_STATES_WITH_OTHERS_ON_SET, // new String[] {sDefaultTextFieldState, sUnderlineState}); // // } // } // } // //// public void validateReferenceAndStates(final SetStatement setStmt) { //// //// setStmt.accept(new AbstractASTExpressionVisitor(){ //// public boolean visitExpression(final Expression expression) { //// IDataBinding dataBinding = expression.resolveDataBinding(); //// if (!StatementValidator.isValidBinding(dataBinding)){ //// return false; //// //// } //// //// if (dataBinding.getKind() != IDataBinding.CLASS_FIELD_BINDING //// && dataBinding.getKind() != IDataBinding.FUNCTION_PARAMETER_BINDING //// && dataBinding.getKind() != IDataBinding.LOCAL_VARIABLE_BINDING //// && dataBinding.getKind() != IDataBinding.STRUCTURE_ITEM_BINDING) { //// //TODO complete //// //FRIEDA why isn't there a message here? saying invalid target for set statement //// return false; //// }else { //// Type typeBinding = expression.resolveType(); //// if (typeBinding == null){ //// return false; //// } //// //// if (TypeUtils.isDynamicType(typeBinding)) { //// //// } //// else if ( StatementValidator.isRecordOrRecordArray(typeBinding) ) { //// List validStates = new ArrayList(); //// validStates.add( EMPTY_INTERN ); //// validStates.add( INITIAL_INTERN ); //// validStates.add( POSITION_INTERN ); //// //// String[] toArray = (String[]) validStates.toArray( new String[0] ); //// validateStates( setStmt,expression, toArray, IProblemRequestor.INVALID_SET_STATE_FOR_RECORD, POSITION_INTERN, new IOnStateDoThis() { //// public void doIt() { //// problemRequestor.acceptProblem(expression, IProblemRequestor.SET_POSITION_STATEMENT_WITH_INVALID_DATAREF, new String[] {expression.getCanonicalString()}); //// } //// }); //// } //// else { //// if( dataBinding.getKind() == IDataBinding.STRUCTURE_ITEM_BINDING ) { //// // The target is not an SQLRecord item, or we wouldn't be here //// // Allow empty if item has substructure //// String[] validStates = ((StructureItemBinding)dataBinding).getChildren().size() == 0 ? //// new String[] {null} : //// new String[] {EMPTY_INTERN}; //// validateStates( setStmt,expression, //// validStates, //// IProblemRequestor.INVALID_SET_STATE_FOR_ITEM); //// } //// else { //// validateStates( setStmt,expression, //// new String[0], //// IProblemRequestor.INVALID_SET_STATE_FOR_ITEM); //// } //// } //// } //// return false; //// //// }//end visit //// }); //// //// } // // private boolean checkNoSubstringAsTarget(final SetStatement setStmt) { // final boolean[] result = new boolean[] {true}; // for(Iterator iter = setStmt.getSetTargets().iterator(); iter.hasNext();) { // ((Expression) iter.next()).accept(new DefaultASTVisitor() { // public boolean visit(ParenthesizedExpression parenthesizedExpression) { // return true; // } // public boolean visit(final SubstringAccess substringAccess) { // problemRequestor.acceptProblem( // substringAccess, // IProblemRequestor.SUBSTRING_EXPRESSION_IN_BAD_LOCATION); // result[0] = false; // return false; // } // }); // } // return result[0]; // } // // private static interface IOnStateDoThis { // void doIt(); // } // // protected boolean validateStates(SetStatement setStmt,Expression expression,String[] internedValidStates, int iErr) { // return validateStates(setStmt, expression, internedValidStates, iErr, null, null); // } // // protected boolean validateStates(SetStatement setStmt,Expression expression,String[] internedValidStates, int iErr, String onState, IOnStateDoThis doThis) { // boolean allValid = true; // for (Iterator iter = setStmt.getStates().iterator(); iter.hasNext();) { // String nextState = InternUtil.intern((String)iter.next()); // if (stateIsSupported(nextState) && !stringInArray(nextState, internedValidStates)) { // allValid = false; // problemRequestor.acceptProblem(expression, // iErr, // new String[]{nextState.toUpperCase()}); // } // else if(nextState == onState) { // doThis.doIt(); // } // } // return allValid; // } // // private static boolean stringInArray(String string, String[] internedArray) { // if (internedArray.length == 0 || internedArray[0] == null){ // return false; // } // for (int i = 0; i < internedArray.length; i++) { // if (internedArray[i] == string) { // return true; // } // } // return false; // } // // private static boolean stateIsSupported(String state) { // return state == POSITION_INTERN // || state == ALARM_INTERN // || state == CURSOR_INTERN // || state == FULL_INTERN // || state == NOHIGHLIGHT_INTERN // || state == BLINK_INTERN // || state == REVERSE_INTERN // || state == UNDERLINE_INTERN // || state == MODIFIED_INTERN // || state == DEFAULTCOLOR_INTERN // || state == BLACK_INTERN // || state == BLUE_INTERN // || state == GREEN_INTERN // || state == MAGENTA_INTERN // || state == RED_INTERN // || state == CYAN_INTERN // || state == YELLOW_INTERN // || state == WHITE_INTERN // || state == BOLD_INTERN // || state == DIM_INTERN // || state == MASKED_INTERN // || state == INVISIBLE_INTERN // || state == NORMALINTENSITY_INTERN // || state == PROTECT_INTERN // || state == SKIP_INTERN // || state == UNPROTECT_INTERN // || state == NORMAL_INTERN // || state == INITIALATTRIBUTES_INTERN // || state == INITIAL_INTERN // || state == EMPTY_INTERN; // } }