@Override public void postProcess(RobotModel model) { Line line = model.getFirstLine(); while (line != null) { if (line instanceof Step) { // loop through all the segments in this line List<StepSegment> segments = ((Step) line).getSegments(); for (int i = 0; i < segments.size(); i++) { if (":FOR".equalsIgnoreCase(segments.get(i).getValue())) { segments.get(i).setSegmentType(SegmentType.LOOP_CONSTRUCT); if (segments.size() > i) { segments.get(i + 1).setSegmentType(SegmentType.VARIABLE); } for (int index = i + 1; index < segments.size(); index++) { if ("IN".equalsIgnoreCase(segments.get(index).getValue()) || "IN RANGE".equalsIgnoreCase(segments.get(index).getValue())) { segments.get(index).setSegmentType(SegmentType.LOOP_CONSTRUCT); } } } } } line = line.getNextLine(); } }
@Override public void postProcess(RobotModel model) { // walk the model looking for keyword calls Line line = model.getFirstLine(); while (line != null) { if (line instanceof Step) { // loop through all the segments in this line running the logic // to alter arguments into keyword calls. // some keyword-invoking keywords may be nested so we need to // continue through all the segments List<StepSegment> segments = ModelUtil.collectStepSegments((Step) line); for (int i = 0; i < segments.size(); i++) { if (segments.get(i).getSegmentType() == SegmentType.KEYWORD_CALL) { String lcStrippedKeywordName = ModelUtil.stripBDDPrefixes(segments.get(i).getValue()).toLowerCase(); // find built-in keywords that take a keyword name as an // argument // in the 1st cell after the current keyword if ("keyword should exist".equals(lcStrippedKeywordName) || "run keyword".equals(lcStrippedKeywordName) || "run keyword and continue on failure".equals(lcStrippedKeywordName) || "run keyword and ignore error".equals(lcStrippedKeywordName) || "run keyword and return".equals(lcStrippedKeywordName) || "run keyword and return status".equals(lcStrippedKeywordName) || "run keyword if all critical tests passed".equals(lcStrippedKeywordName) || "run keyword if all tests passed".equals(lcStrippedKeywordName) || "run keyword if any critical tests failed".equals(lcStrippedKeywordName) || "run keyword if any tests failed".equals(lcStrippedKeywordName) || "run keyword if test failed".equals(lcStrippedKeywordName) || "run keyword if test passed".equals(lcStrippedKeywordName) || "run keyword if timeout occurred".equals(lcStrippedKeywordName)) { if (segments.size() > i + 1) { segments.get(i + 1).setSegmentType(SegmentType.KEYWORD_CALL); } // in the 2nd cell after the current keyword } else if ("repeat keyword".equals(lcStrippedKeywordName) || "run keyword and expect error".equals(lcStrippedKeywordName) || "run keyword and return if".equals(lcStrippedKeywordName) || "run keyword if".equals(lcStrippedKeywordName) || "run keyword unless".equals(lcStrippedKeywordName)) { if (segments.size() > i + 2) { segments.get(i + 2).setSegmentType(SegmentType.KEYWORD_CALL); } // in the 3rd cell after the current keyword } else if ("wait until keyword succeeds".equals(lcStrippedKeywordName)) { if (segments.size() > i + 3) { segments.get(i + 3).setSegmentType(SegmentType.KEYWORD_CALL); } // the Run Keywords builtin function is a special // case // it can invoke a variable number of keywords, some // of which may take arguments } else if ("run keywords".equals(lcStrippedKeywordName)) { // first look for any "AND" control argument in the // subsequent steps boolean hasAnd = false; if (i < segments.size()) { for (int index = i + 1; index < segments.size(); index++) { if ("AND".equalsIgnoreCase(segments.get(index).getValue())) { hasAnd = true; break; } } } if (hasAnd) { // if AND is present we use it to break keywords boolean nextSegmentIsKeyword = true; for (int index = i + 1; index < segments.size(); index++) { if (segments.get(index).getSegmentType() == SegmentType.COMMENT) { break; } else if (nextSegmentIsKeyword) { segments.get(index).setSegmentType(SegmentType.KEYWORD_CALL); nextSegmentIsKeyword = false; } else if ("AND".equalsIgnoreCase(segments.get(index).getValue())) { segments.get(index).setSegmentType(SegmentType.CONTROL_ARGUMENT); nextSegmentIsKeyword = true; } else { segments.get(index).setSegmentType(SegmentType.ARGUMENT); } } } else { // otherwise every argument after this segment // is to be treated as a keyword for (int index = i + 1; index < segments.size(); index++) { if (segments.get(index).getSegmentType() == SegmentType.COMMENT) { break; } segments.get(index).setSegmentType(SegmentType.KEYWORD_CALL); } } } } } } line = line.getNextLine(); } }