void SchemeThread::read() { bool more=true; bool prompt=true; String text=String::empty; CodeDocument doc; CodeDocument::Position pos(&doc,0); while (more && !threadShouldExit()) { if (prompt) { Console::getInstance()->printPrompt(); prompt=false; } std::string line=""; getline(std::cin, line); if (!text.isEmpty()) text << T("\n"); text << String(line.c_str()); int typ; doc.replaceAllContent(text); pos.setPosition(0); typ=LispSyntax::getInstance()->scanCode(doc, pos, true, ScanIDs::MoveExpressions); if (typ==ScanIDs::SCAN_LIST || typ==ScanIDs::SCAN_TOKEN || typ==ScanIDs::SCAN_STRING) break; else if (typ==ScanIDs::SCAN_UNLEVEL) break; // allow too many parens to be passed to lisp? } if (!text.isEmpty()) eval(text); }
/** * Add a TextBlock object to the m_textblockVector List. * @param add_object text block to add * @return boolean value where false means not added because an TextBlock * object with that tag already exists in this document. */ bool CodeGenObjectWithTextBlocks::addTextBlock(TextBlock* add_object ) { QString tag = add_object->getTag(); // assign a tag if one doesn't already exist if (tag.isEmpty()) { tag = getUniqueTag(); add_object->setTag(tag); } else { // if it has a tag, check to see that it is not in some other parent object // IF it is then we will need to remove it FIRST before adding to new parent CodeDocument * parentDoc = add_object->getParentDocument(); if (parentDoc) { CodeGenObjectWithTextBlocks * oldParent = parentDoc->findParentObjectForTaggedTextBlock (tag); if (oldParent && oldParent != this) oldParent->removeTextBlock(add_object); } } if (m_textBlockTagMap.contains(tag)) return false; // return false, we already have some object with this tag in the list // if we get here, then the object is a "fresh" one, we havent // added before. Add it now and return true. m_textBlockTagMap.insert(tag, add_object); m_textblockVector.append(add_object); return true; }
CodeDocument& ValueList::getDocument (const File& file) { const int index = documentFiles.indexOf (file.getFullPathName()); if (index >= 0) return *documents.getUnchecked (index); CodeDocument* doc = documents.add (new CodeDocument()); documentFiles.add (file); doc->replaceAllContent (file.loadFileAsString()); doc->clearUndoHistory(); return *doc; }
bool update (CodeDocument& codeDoc, int lineNum, CodeDocument::Iterator& source, CodeTokeniser* tokeniser, const int tabSpaces, const CodeDocument::Position& selStart, const CodeDocument::Position& selEnd) { Array <SyntaxToken> newTokens; newTokens.ensureStorageAllocated (8); if (tokeniser == nullptr) { const String line (codeDoc.getLine (lineNum)); addToken (newTokens, line, line.length(), -1); } else if (lineNum < codeDoc.getNumLines()) { const CodeDocument::Position pos (codeDoc, lineNum, 0); createTokens (pos.getPosition(), pos.getLineText(), source, *tokeniser, newTokens); } replaceTabsWithSpaces (newTokens, tabSpaces); int newHighlightStart = 0; int newHighlightEnd = 0; if (selStart.getLineNumber() <= lineNum && selEnd.getLineNumber() >= lineNum) { const String line (codeDoc.getLine (lineNum)); CodeDocument::Position lineStart (codeDoc, lineNum, 0), lineEnd (codeDoc, lineNum + 1, 0); newHighlightStart = indexToColumn (jmax (0, selStart.getPosition() - lineStart.getPosition()), line, tabSpaces); newHighlightEnd = indexToColumn (jmin (lineEnd.getPosition() - lineStart.getPosition(), selEnd.getPosition() - lineStart.getPosition()), line, tabSpaces); } if (newHighlightStart != highlightColumnStart || newHighlightEnd != highlightColumnEnd) { highlightColumnStart = newHighlightStart; highlightColumnEnd = newHighlightEnd; } else if (tokens == newTokens) { return false; } tokens.swapWith (newTokens); return true; }
const Array<Range<int> > CtrlrLuaMethodCodeEditor::searchForMatchesInDocument(CodeDocument &doc, const String &search) { Array<Range<int> > results; int position = -1; lastFoundPosition = -1; do { String documentContent = doc.getAllContent(); if (documentContent.isNotEmpty()) { if (editorComponent->isCaseSensitiveSearch()) { position = documentContent.indexOfIgnoreCase (lastFoundPosition+1, search); } else { position = documentContent.indexOf (lastFoundPosition+1, search); } } if (position >= 0) { lastFoundPosition = position; results.add (Range<int> (lastFoundPosition, lastFoundPosition+search.length())); } else { lastFoundPosition = -1; } } while (lastFoundPosition >= 0); return (results); }
void documentChanged (CodeDocument& doc) { const int newNumLines = doc.getNumLines(); if (newNumLines != lastNumLines) { lastNumLines = newNumLines; repaint(); } }
/** * Load codegenerator data from xmi. * @param qElement the element from which to load */ void CodeGenerator::loadFromXMI(QDomElement & qElement) { // look for our particular child element QDomNode node = qElement.firstChild(); QDomElement element = node.toElement(); QString langType = Model_Utils::progLangToString( language() ); if (qElement.tagName() != "codegenerator" || qElement.attribute("language", "UNKNOWN") != langType) { return; } // got our code generator element, now load // codedocuments QDomNode codeDocNode = qElement.firstChild(); QDomElement codeDocElement = codeDocNode.toElement(); while (!codeDocElement.isNull()) { QString docTag = codeDocElement.tagName(); QString id = codeDocElement.attribute( "id", "-1" ); if (docTag == "sourcecode") { loadCodeForOperation(id, codeDocElement); } else if (docTag == "codedocument" || docTag == "classifiercodedocument") { CodeDocument * codeDoc = findCodeDocumentByID(id); if (codeDoc) { codeDoc->loadFromXMI(codeDocElement); } else { uWarning() << "missing code document for id:" << id; } } else { uWarning() << "got strange codegenerator child node:" << docTag << ", ignoring."; } codeDocNode = codeDocElement.nextSibling(); codeDocElement = codeDocNode.toElement(); } }
CodeDocumentDeleteAction (CodeDocument& doc, const int start, const int end) noexcept : owner (doc), startPos (start), endPos (end), removedText (doc.getTextBetween (CodeDocument::Position (doc, start), CodeDocument::Position (doc, end))) { }
bool update (CodeDocument& document, int lineNum, CodeDocument::Iterator& source, CodeTokeniser* analyser, const int spacesPerTab, const CodeDocument::Position& selectionStart, const CodeDocument::Position& selectionEnd) { OwnedArray <SyntaxToken> newTokens; if (analyser == 0) { newTokens.add (new SyntaxToken (document.getLine (lineNum), -1)); } else if (lineNum < document.getNumLines()) { const CodeDocument::Position pos (&document, lineNum, 0); createTokens (pos.getPosition(), pos.getLineText(), source, analyser, newTokens); } replaceTabsWithSpaces (newTokens, spacesPerTab); int newHighlightStart = 0; int newHighlightEnd = 0; if (selectionStart.getLineNumber() <= lineNum && selectionEnd.getLineNumber() >= lineNum) { const String line (document.getLine (lineNum)); CodeDocument::Position lineStart (&document, lineNum, 0), lineEnd (&document, lineNum + 1, 0); newHighlightStart = indexToColumn (jmax (0, selectionStart.getPosition() - lineStart.getPosition()), line, spacesPerTab); newHighlightEnd = indexToColumn (jmin (lineEnd.getPosition() - lineStart.getPosition(), selectionEnd.getPosition() - lineStart.getPosition()), line, spacesPerTab); } if (newHighlightStart != highlightColumnStart || newHighlightEnd != highlightColumnEnd) { highlightColumnStart = newHighlightStart; highlightColumnEnd = newHighlightEnd; } else { if (tokens.size() == newTokens.size()) { bool allTheSame = true; for (int i = newTokens.size(); --i >= 0;) { if (*tokens.getUnchecked(i) != *newTokens.getUnchecked(i)) { allTheSame = false; break; } } if (allTheSame) return false; } } tokens.swapWithArray (newTokens); return true; }
/** * Need to overwrite this for ruby since we need to pick up the * ruby class declaration block. * Sigh. NOT optimal. The only reason that we need to have this * is so we can create the RubyClassDeclarationBlock. * would be better if we could create a handler interface that each * codeblock used so all we have to do here is add the handler * for "rubyclassdeclarationblock". */ void RubyClassifierCodeDocument::loadChildTextBlocksFromNode(QDomElement & root) { QDomNode tnode = root.firstChild(); QDomElement telement = tnode.toElement(); bool loadCheckForChildrenOK = false; while (!telement.isNull()) { QString nodeName = telement.tagName(); if (nodeName == QLatin1String("textblocks")) { QDomNode node = telement.firstChild(); QDomElement element = node.toElement(); // if there is nothing to begin with, then we don't worry about it loadCheckForChildrenOK = element.isNull() ? true : false; while (!element.isNull()) { QString name = element.tagName(); if (name == QLatin1String("codecomment")) { CodeComment * block = new RubyCodeComment(this); block->loadFromXMI(element); if (!addTextBlock(block)) { uError()<<"loadFromXMI : unable to add codeComment to :"<<this; delete block; } else { loadCheckForChildrenOK= true; } } else if (name == QLatin1String("codeaccessormethod") || name == QLatin1String("ccfdeclarationcodeblock")) { QString acctag = element.attribute(QLatin1String("tag")); // search for our method in the TextBlock * tb = findCodeClassFieldTextBlockByTag(acctag); if (!tb || !addTextBlock(tb)) { uError()<<"loadFromXMI : unable to add codeclassfield child method to:"<<this; // DON'T delete } else { loadCheckForChildrenOK= true; } } else if (name == QLatin1String("codeblock")) { CodeBlock * block = newCodeBlock(); block->loadFromXMI(element); if (!addTextBlock(block)) { uError()<<"loadFromXMI : unable to add codeBlock to :"<<this; delete block; } else { loadCheckForChildrenOK= true; } } else if (name == QLatin1String("codeblockwithcomments")) { CodeBlockWithComments * block = newCodeBlockWithComments(); block->loadFromXMI(element); if (!addTextBlock(block)) { uError()<<"loadFromXMI : unable to add codeBlockwithcomments to:"<<this; delete block; } else { loadCheckForChildrenOK= true; } } else if (name == QLatin1String("header")) { // do nothing.. this is treated elsewhere } else if (name == QLatin1String("hierarchicalcodeblock")) { HierarchicalCodeBlock * block = newHierarchicalCodeBlock(); block->loadFromXMI(element); if (!addTextBlock(block)) { uError()<<"Unable to add hierarchicalcodeBlock to:"<<this; delete block; } else { loadCheckForChildrenOK= true; } } else if (name == QLatin1String("codeoperation")) { // find the code operation by id QString id = element.attribute(QLatin1String("parent_id"), QLatin1String("-1")); UMLObject * obj = UMLApp::app()->document()->findObjectById(Uml::ID::fromString(id)); UMLOperation * op = dynamic_cast<UMLOperation*>(obj); if (op) { CodeOperation * block = new RubyCodeOperation(this, op); block->loadFromXMI(element); if (addTextBlock(block)) { loadCheckForChildrenOK= true; } else { uError()<<"Unable to add codeoperation to:"<<this; block->deleteLater(); } } else { uError()<<"Unable to find operation create codeoperation for:"<<this; } } else if (name == QLatin1String("rubyclassdeclarationblock")) { RubyClassDeclarationBlock * block = getClassDecl(); block->loadFromXMI(element); if (!addTextBlock(block)) { uError()<<"Unable to add ruby code declaration block to:"<<this; // DON'T delete. // block->deleteLater(); } else { loadCheckForChildrenOK= true; } } else { uDebug()<<" LoadFromXMI: Got strange tag in text block stack:"<<name<<", ignoring"; } node = element.nextSibling(); element = node.toElement(); } break; } tnode = telement.nextSibling(); telement = tnode.toElement(); } if (!loadCheckForChildrenOK) { CodeDocument * test = dynamic_cast<CodeDocument*>(this); if (test) { uWarning()<<" loadChildBlocks : unable to initialize any child blocks in doc: "<<test->getFileName()<<" "<<this; } else { HierarchicalCodeBlock * hb = dynamic_cast<HierarchicalCodeBlock*>(this); if (hb) uWarning()<<" loadChildBlocks : unable to initialize any child blocks in Hblock: "<<hb->getTag()<<" "<<this; else uDebug()<<" loadChildBlocks : unable to initialize any child blocks in UNKNOWN OBJ:"<<this; } } }
// Sigh. NOT optimal. The only reason that we need to have this // is so we can create the CPPHeaderClassDeclarationBlock. // would be better if we could create a handler interface that each // codeblock used so all we have to do here is add the handler void CPPHeaderCodeDocument::loadChildTextBlocksFromNode ( QDomElement & root) { QDomNode tnode = root.firstChild(); QDomElement telement = tnode.toElement(); bool loadCheckForChildrenOK = false; while( !telement.isNull() ) { QString nodeName = telement.tagName(); if( nodeName == "textblocks" ) { QDomNode node = telement.firstChild(); QDomElement element = node.toElement(); // if there is nothing to begin with, then we don't worry about it loadCheckForChildrenOK = element.isNull() ? true : false; while( !element.isNull() ) { QString name = element.tagName(); if( name == "codecomment" ) { CodeComment * block = new CPPCodeDocumentation(this); block->loadFromXMI(element); if(!addTextBlock(block)) { kError()<<"Unable to add codeComment to :"<<this<<endl; block->deleteLater(); } else loadCheckForChildrenOK= true; } else if( name == "codeaccessormethod" || name == "ccfdeclarationcodeblock" ) { QString acctag = element.attribute("tag",""); // search for our method in the TextBlock * tb = findCodeClassFieldTextBlockByTag(acctag); if(!tb || !addTextBlock(tb)) { kError()<<"Unable to add codeclassfield child method to:"<<this<<endl; // DON'T delete } else loadCheckForChildrenOK= true; } else if( name == "codeblock" ) { CodeBlock * block = newCodeBlock(); block->loadFromXMI(element); if(!addTextBlock(block)) { kError()<<"Unable to add codeBlock to :"<<this<<endl; block->deleteLater(); } else loadCheckForChildrenOK= true; } else if( name == "codeblockwithcomments" ) { CodeBlockWithComments * block = newCodeBlockWithComments(); block->loadFromXMI(element); if(!addTextBlock(block)) { kError()<<"Unable to add codeBlockwithcomments to:"<<this<<endl; block->deleteLater(); } else loadCheckForChildrenOK= true; } else if( name == "header" ) { // do nothing.. this is treated elsewhere } else if( name == "hierarchicalcodeblock" ) { HierarchicalCodeBlock * block = newHierarchicalCodeBlock(); block->loadFromXMI(element); if(!addTextBlock(block)) { kError()<<"Unable to add hierarchicalcodeBlock to:"<<this<<endl; block->deleteLater(); } else loadCheckForChildrenOK= true; } else if( name == "codeoperation" ) { // find the code operation by id QString id = element.attribute("parent_id","-1"); UMLObject * obj = UMLApp::app()->getDocument()->findObjectById(STR2ID(id)); UMLOperation * op = dynamic_cast<UMLOperation*>(obj); if(op) { CodeOperation * block = new CPPHeaderCodeOperation(this, op); block->loadFromXMI(element); if(addTextBlock(block)) loadCheckForChildrenOK= true; else { kError()<<"Unable to add codeoperation to:"<<this<<endl; block->deleteLater(); } } else kError()<<"Unable to find operation create codeoperation for:"<<this<<endl; } else if( name == "cppheaderclassdeclarationblock" ) { CPPHeaderClassDeclarationBlock * block = getClassDecl(); block->loadFromXMI(element); // normally this would be populated by the following syncToparent // call, but we cant wait for it, so lets just do it now. namespaceBlock = getHierarchicalCodeBlock("namespace", "Namespace", 0); if(!namespaceBlock || !namespaceBlock->addTextBlock(block)) { kError()<<"Error:cant add class declaration codeblock"<<endl; // DON'T delete/release block // block->release(); } else loadCheckForChildrenOK= true; } // only needed for extreme debugging conditions (E.g. making new codeclassdocument loader) //else //kDebug()<<" LoadFromXMI: Got strange tag in text block stack:"<<name<<", ignorning"<<endl; node = element.nextSibling(); element = node.toElement(); } break; } tnode = telement.nextSibling(); telement = tnode.toElement(); } if(!loadCheckForChildrenOK) { CodeDocument * test = dynamic_cast<CodeDocument*>(this); if(test) { kWarning()<<" loadChildBlocks : unable to initialize any child blocks in doc: "<<test->getFileName()<<" "<<this<<endl; } else { HierarchicalCodeBlock * hb = dynamic_cast<HierarchicalCodeBlock*>(this); if(hb) kWarning()<<" loadChildBlocks : unable to initialize any child blocks in Hblock: "<<hb->getTag()<<" "<<this<<endl; else kDebug()<<" loadChildBlocks : unable to initialize any child blocks in UNKNOWN OBJ:"<<this<<endl; } } }