Пример #1
0
void ClassDiagramView::displayAddClassDialog()
    {
    AddClassDialog dialog;

    ClassNode *node = gClassDiagramView->getNode(gStartPosInfo.x, gStartPosInfo.y);
    if(node && node->getType())
        {
        OovString title = "Add Class ";
        title += node->getType()->getName();
        dialog.setTitle(title);
        }

    // Fill the dialog with the default radio button and selected class info.
    GtkWidget *radio = Builder::getBuilder()->getWidget("AddClassStandardRadiobutton");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), true);
    GtkWidget *relayout = Builder::getBuilder()->getWidget("AddClassRelayoutCheckbutton");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(relayout), false);
    // Even though the toggle was set above, it doesn't trigger unless it has changed.
    on_AddClassStandardRadiobutton_toggled(radio, nullptr);
    if(dialog.run(true))
        {
        getDiagram().addRelatedNodesRecurse(getDiagram().getModelData(),
            dialog.getSelectedType(), dialog.getSelectedAddType());
        updateGraph(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(relayout)));
        }
    }
Пример #2
0
/**
 * Checks for invalid methods (e.g., overloading vs. overriding)
 */
void typecheck::CheckScope::checkMethods(ClassNode* cls) {
  string* superName = cls->getSuper();
  if(superName == nullptr) {
    return;
  }
  Groot* groot = cls->getLexParent();

  /* For every method defined in this class... */
  for(auto method_kv : cls->getMethods()) {
    string methodSig = getMethodSig(cls, string(method_kv.first));

    /* Step up the inheritance tree, checking for another method with the same signature */
    while(superName != nullptr) {
      ClassNode* superClass = groot->getClasses()[*superName]; // Get the node for the symbol class. Note that cls->getLexParent() returns Groot.
      superName = superClass->getSuper();

      /* If this super doesn't have a method by the correct name, don't bother checking the signatures */
      if(superClass->getMethods().find(method_kv.first) == superClass->getMethods().end()) {
        continue;
      }

      if(methodSig != getMethodSig(superClass, method_kv.first)) {
        std::stringstream msg;
        msg << "Error: Method '" << method_kv.first << "' has a different signature from the super class";

        throw ScopeCheckErr(msg.str().c_str());
      }
    }
  }
}
Пример #3
0
void QsCodeParser::parseHeaderFile(const Location& location,
                                   const QString& filePath,
                                   Tree *tree)
{
    qsTre = tree;

    FILE *in = fopen(QFile::encodeName(filePath), "r");
    if (in == 0) {
	location.error(tr("Cannot open Qt Script class list '%1'")
			.arg(filePath));
	return;
    }

    Location fileLocation(filePath);
    Tokenizer fileTokenizer(fileLocation, in);
    int tok = fileTokenizer.getToken();
    while (tok != Tok_Eoi) {
	if (tok == Tok_Ident) {
	    ClassNode *quickClass = new ClassNode(qsTre->root(),
						   fileTokenizer.lexeme());
	    quickClass->setLocation(fileTokenizer.location());
	}
        else {
	    fileTokenizer.location().error(tr("Unexpected token '%1' in Qt"
					       " Script class list")
					    .arg(fileTokenizer.lexeme()));
	    break;
	}
	tok = fileTokenizer.getToken();
    }
    fclose(in);
}
Пример #4
0
/**
 * Defines the requirements for a valid class scope
 * Throws a ScopeCheckErr exception if there's a problem.
 */
void typecheck::CheckScope::checkClass(typecheck::ClassNode* cls) {
  string* superName = cls->getSuper();
  if(superName == nullptr) {
    return;
  }

  /* Register the super class if it exists, but flag it as unimplemented.
     If the class already exists in the confirmedClasses map, don't reset
     it (we don't want to stomp a value of true with a value of false) */
  if(confirmedClasses.find(*superName) == confirmedClasses.end()) {
    confirmedClasses.insert(std::pair<string, bool>(*superName, false));
  }

  /* Make sure there aren't any attributes defined in this class that are also defined in its parent. */
  Groot* groot = cls->getLexParent();
  for(auto attr_kv : cls->getMembers()) {

    /* Step up the inheritance tree, checking for variables with similar names */
    while(superName != nullptr) {
      ClassNode* superClass = groot->getClasses()[*superName]; // Get the node for the symbol class. Note that cls->getLexParent() returns Groot.

      /* If the this super class has the same variable, throw error */
      if(superClass->getMembers().count(attr_kv.first) >= 1) {
        std::stringstream msg;
        msg << "Error: Instance variable '" << attr_kv.first << "' already exists in a super class '" << *superName << "'" << endl;

        throw ScopeCheckErr(msg.str().c_str());
      }

      superName = superClass->getSuper();
    }
  }
}
Пример #5
0
extern "C" G_MODULE_EXPORT void on_GotoClassMenuitem_activate(
    GtkWidget * /*widget*/, gpointer /*data*/)
    {
    ClassNode *node = gClassDiagramView->getNode(gStartPosInfo.x, gStartPosInfo.y);
    if(node)
        {
        gClassDiagramView->gotoClass(node->getType()->getName());
        }
    }
Пример #6
0
bool QsCodeParser::makeFunctionNode(const QString& synopsis,
				     QStringList *parentPathPtr,
				     FunctionNode **funcPtr)
{
    QRegExp funcRegExp(
	    "\\s*([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+)\\s*\\((" +
            balancedParens +
	    ")\\)(?:\\s*:\\s*([A-Za-z0-9_]+))?\\s*");
    QRegExp paramRegExp(
	    "\\s*(\\[)?\\s*(?:([A-Za-z0-9_]+)\\s*:\\s*)?"
	    "([A-Za-z0-9_]+|\\.\\.\\.)\\s*(\\[)?[\\s\\]]*");

    if (!funcRegExp.exactMatch(synopsis))
	return false;

    ClassNode *classe = (ClassNode*)
        qsTre->findNode(QStringList(funcRegExp.cap(1)),Node::Class);
    if (classe == 0)
	return false;

    FunctionNode *clone = new FunctionNode(0, funcRegExp.cap(2));
    bool optional = false;

    QString paramStr = funcRegExp.cap(3);
    QStringList params = paramStr.split(",");
    QStringList::ConstIterator p = params.begin();
    while (p != params.end()) {
	if (paramRegExp.exactMatch(*p)) {
	    if (!paramRegExp.cap(1).isEmpty())
		optional = true;
	    clone->addParameter(Parameter(paramRegExp.cap(3),
                                          "",
                                          paramRegExp.cap(2),
                                          optional ? "undefined" : ""));
	    if (!paramRegExp.cap(4).isEmpty())
		optional = true;
	}
        else {
	    delete clone;
	    return false;
	}
	++p;
    }
    QString returnType = funcRegExp.cap(4);
    if (!returnType.isEmpty())
	clone->setReturnType(returnType);
    if (parentPathPtr != 0)
	*parentPathPtr = QStringList() << classe->name();
    if (funcPtr != 0) {
	*funcPtr = clone;
    }
    else {
	delete clone;
    }
    return true;
}
Пример #7
0
void TemplateClassInstanceNode::checkSemantic(TemplateArguments* templateArguments)
{
	assert(0 == templateArguments);
	assert(m_typeNode && m_classTypeNode);
	ClassNode* classNode = static_cast<ClassNode*>(m_classTypeNode->m_classNode);

	g_errorList.setTemplateClassInstance(this);
	classNode->checkSemantic(&m_templateArguments);
	g_errorList.setTemplateClassInstance(0);
}
Пример #8
0
extern "C" G_MODULE_EXPORT void on_ViewSourceMenuitem_activate(
    GtkWidget * /*widget*/, gpointer /*data*/)
    {
    ClassNode *node = gClassDiagramView->getNode(gStartPosInfo.x, gStartPosInfo.y);
    if(node)
        {
        const ModelClassifier *classifier = ModelClassifier::getClass(node->getType());
        if(classifier && classifier->getModule())
            {
            gClassDiagramView->viewSource(classifier->getModule()->getModulePath(),
                classifier->getLineNum());
            }
        }
    }
Пример #9
0
extern "C" G_MODULE_EXPORT void on_ClassPreferencesMenuitem_activate(
    GtkWidget * /*widget*/, gpointer /*data*/)
    {
    ClassNode *node = gClassDiagramView->getNode(gStartPosInfo.x, gStartPosInfo.y);
    if(node)
        {
        ClassPreferencesDialog dlg;
        if(dlg.run(*Builder::getBuilder(), node->getNodeOptions()))
            {
            gClassDiagramView->getDiagram().changeOptions(getDrawOptions(
                    gClassDiagramView->getGuiOptions()));
            gClassDiagramView->drawToDrawingArea();
            }
        }
    }
Пример #10
0
void handlePopup(ClassGraph::eAddNodeTypes addType)
    {
    static int depth = 0;
    depth++;
    if(depth == 1)
        {
        ClassNode *node = gClassDiagramView->getNode(gStartPosInfo.x, gStartPosInfo.y);
        if(node)
            {
            gClassDiagramView->getDiagram().addRelatedNodesRecurse(
                    gClassDiagramView->getDiagram().getModelData(),
                    node->getType(), addType);
            gClassDiagramView->updateGraph(true);
            }
        }
    depth--;
    }
Пример #11
0
void handleToggle(GtkWidget *widget,  ClassGraph::eAddNodeTypes addType)
    {
    static int depth = 0;
    depth++;
    if(depth == 1)
        {
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
            {
            ClassNode *node = gClassDiagramView->getNode(gStartPosInfo.x, gStartPosInfo.y);
            if(node)
                {
                gClassDiagramView->selectAddClass(node->getType(), addType);
                }
            }
        }
    depth--;
    }
Пример #12
0
bool ClassGraph::isNodeTypePresent(ClassNode const &node,
        std::vector<ClassNode> const &nodes)
    {
    auto nodeIter = std::find_if(nodes.begin(), nodes.end(),
            [&node](ClassNode const &existingNode)
                { return(node.getType() == existingNode.getType()); });
    return (nodeIter != nodes.end());
    }
Пример #13
0
/**
 * Checks for inheritance cycles of classes.
 */
void typecheck::CheckScope::checkInheritanceCycles(typecheck::ClassNode* cls) {
  Groot* groot = cls->getLexParent();
  std::set<ClassNode*> visitedClasses;
  ClassNode* cur = cls;
  string* superName = cls->getSuper();

  while(superName != nullptr) {
    if(visitedClasses.find(cur) == visitedClasses.end()) {
      visitedClasses.insert(cur);
    } else {
      std::stringstream msg;
      msg << "Error: Class '" << *superName << "' is in an inheritance cycle." << endl;
      throw ScopeCheckErr(msg.str().c_str());
    }
    cur = groot->getClasses()[*superName];
    superName = cur->getSuper();
  }
}
Пример #14
0
// This is set in glade.
//    gtk_widget_add_events(mDrawingArea, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
//          GDK_FOCUS_CHANGE_MASK);
void ClassDiagramView::buttonReleaseEvent(const GdkEventButton *event)
    {
    if(event->button == 1)
        {
//      if(abs(event->x - gPressInfo.startPos.x) > 5 ||
//              abs(event->y - gPressInfo.startPos.y) > 5)
            {
            ClassNode *node = getNode(
                    gStartPosInfo.x, gStartPosInfo.y);
            if(node)
                {
                GraphPoint clickOffset(static_cast<int>(event->x),
                    static_cast<int>(event->y));
                clickOffset.sub(gStartPosInfo);
                GraphPoint newPos(node->getPosition());
                newPos.add(clickOffset.getZoomed(1/mClassDiagram.getDesiredZoom()));

                node->setPosition(newPos);
                mClassDiagram.setModified();
                drawToDrawingArea();
                }
            }
//      else
            {
/*
            DiagramNode *node = getNode(event->x, event->y);
            if(node)
                {
//              gDiagramGraph.clearGraph();
//              gLastSelectedClassName = node->getClassifier()->getName();
//              gDiagramGraph.addNodes(gModelData, node->getClassifier());
//              gDiagramGraph.setGraph(gModelData, getDrawOptions());
//              gDiagramGraph.drawDiagram(getDrawOptions());
                }
*/
            }
        }
    else
        {
        displayDrawContextMenu(event->button, event->time,
            reinterpret_cast<gpointer>(const_cast<GdkEventButton*>(event)));
        }
    }
Пример #15
0
void ClassGraph::removeNode(const ClassNode &node)
    {
    for(size_t i=0; i<mNodes.size(); i++)
        {
        if(mNodes[i].getType() == node.getType())
            {
            mNodes.erase(mNodes.begin() + i);
            break;
            }
        }
    mModified = true;
    }
Пример #16
0
void SourceFileGenerator::generateCode_AdditionalMethod(FILE* file, MethodNode* methodNode, int indentation)
{
	ClassNode* classNode = static_cast<ClassNode*>(methodNode->m_enclosing);

	generateCode_TemplateHeader(file, classNode, indentation);


	writeStringToFile("inline ", file, indentation);

	std::string typeName;
	GetClassName(typeName, classNode);


	writeStringToFile(typeName.c_str(), file);

	if(0 != methodNode->m_passing)
	{
		generateCode_Token(file, methodNode->m_passing, 0);
	}
	writeStringToFile(g_strSpaces, 1, file);
	writeStringToFile(typeName.c_str(), file);
	writeStringToFile("::", file);

	generateCode_Identify(file, methodNode->m_name, 0);

	generateCode_Token(file, methodNode->m_leftParenthesis, 0);
	std::vector<std::pair<TokenNode*, ParameterNode*>> parameterNodes;
	methodNode->collectParameterNodes(parameterNodes);
	size_t parameterCount = parameterNodes.size();
	for(size_t i = 0; i < parameterCount; ++i)
	{
		if(parameterNodes[i].first)
		{
			generateCode_Token(file, parameterNodes[i].first, 0);
		}
		generateCode_Parameter(file, parameterNodes[i].second, methodNode, 0);
	}
	generateCode_Token(file, methodNode->m_rightParenthesis, 0);
	writeStringToFile("\n", file);
	char buf[512];
	writeStringToFile("{\n", file, indentation);
	if("NewArray" == methodNode->m_name->m_str)
	{
		if(classNode->isValueType())
		{
			sprintf_s(buf, "return new_array<%s>(count);\n", typeName.c_str());
		}
		else
		{
			sprintf_s(buf, "return new_array<::pafcore::RefCountObject<%s>>(count);\n", typeName.c_str());
		}
		writeStringToFile(buf, file, indentation + 1);
	}
	else if("NewArrayARC" == methodNode->m_name->m_str)
	{
		sprintf_s(buf, "return new_array<::pafcore::AtomicRefCountObject<%s>>(count);\n", typeName.c_str());
		writeStringToFile(buf, file, indentation + 1);
	}
	else
	{
		if("New" == methodNode->m_name->m_str || "Clone" == methodNode->m_name->m_str)
		{
			if(classNode->isValueType())
			{
				sprintf_s(buf, "return new %s(", typeName.c_str());
			}
			else
			{
				sprintf_s(buf, "return new ::pafcore::RefCountObject<%s>(", typeName.c_str());
			}
		}
		else
		{
			assert("NewARC" == methodNode->m_name->m_str || "CloneARC" == methodNode->m_name->m_str);
			sprintf_s(buf, "return new ::pafcore::AtomicRefCountObject<%s>(", typeName.c_str());
		}
		writeStringToFile(buf, file, indentation + 1);
		for(size_t i = 0; i < parameterCount; ++i)
		{
			if(i != 0)
			{
				writeStringToFile(", ", file);
			}
			writeStringToFile(parameterNodes[i].second->m_name->m_str.c_str(), file);
		}
		writeStringToFile(");\n", file);
	}
	writeStringToFile("}\n\n", file, indentation);
}
Пример #17
0
void DebugPrintVisitor::visit(ClassNode& cl)
{
    os << "[Class]" << cl.name() << getPositionString(cl) << std::endl;
}
Пример #18
0
//----------------------------------------------------------------------------------------------
std::string& CObjectAbstract::GetValueString(std::string &OutValue, bool bSaveAsExternal /*= false*/) const
{
	typedef std::pair<std::string, std::string> TPairString;

    oes::rflex::AppClassTree &CTree = oes::rflex::GetClassTree();

	std::map<std::string, std::string> ValueMap;

	ClassNode *pOwnClassNode = CTree.Find(GetType());

	if (pOwnClassNode)
	{
		// prepare storage holder

		// Default block name
		ValueMap.insert(TPairString("Value", std::string("Name:") + GetName() + " "));

		if (GetExternal()){
			ValueMap.insert(TPairString("External", GetFilenameTag()));
		}

		// write down groups map
		ClassNode *pClassNode = pOwnClassNode;

		while (pClassNode)
		{
			// general properties
			const ClassNode::TVecProperties &VecProps = pClassNode->GetProperties();
			ClassNode::TVecPropertyConstIterator IterProp = VecProps.begin();

			while (IterProp != VecProps.end())
			{
				if (ValueMap.find((*IterProp)->GetGroupName()) == ValueMap.end())
				{
					ValueMap.insert(TPairString((*IterProp)->GetGroupName(), ""));
				}
				++IterProp;
			}

			// Interfaces
			const ClassNode::TVecInterfaces &VecInterfaces = pClassNode->GetInterfaceProps();
			ClassNode::TVecInterfaceConstIter IterIntf = VecInterfaces.begin();

			while (IterIntf != VecInterfaces.end())
			{
				ClassNode *pInfClass = CTree.FindInterface((*IterIntf)->strType);

				if (pInfClass)
				{
					const ClassNode::TVecProperties &IntfPropArray = pInfClass->GetProperties();
					ClassNode::TVecPropertyConstIterator &IterPropIntf = IntfPropArray.begin();

					while (IterPropIntf != IntfPropArray.end())
					{
						if (ValueMap.find((*IterPropIntf)->GetGroupName()) == ValueMap.end())
						{
							ValueMap.insert(TPairString((*IterPropIntf)->GetGroupName(), ""));
						}
						++IterPropIntf;
					}
				}
				++IterIntf;
			}
			pClassNode = pClassNode->GetRootNode();
		}

		// write down values by group name
		std::map<std::string, std::string>::iterator IterGroup = ValueMap.begin();

		while (IterGroup != ValueMap.end())
		{
			if (IterGroup->first == "External"){ // already added skip
				IterGroup++;
			}

			ClassNode *pClassNode = pOwnClassNode;

			// write 
			while (pClassNode)
			{
				const ClassNode::TVecProperties &PropsArray = pClassNode->GetProperties();
				ClassNode::TVecPropertyConstIterator IterProp = PropsArray.begin();

				while (IterProp != PropsArray.end())
				{
					if (!bSaveAsExternal && (GetExternal() && !(*IterProp)->IsExternalProp()))
					{
						++IterProp;
						continue;
					}

					if ((*IterProp)->IsSerializable() && IterGroup->first == (*IterProp)->GetGroupName())
					{
						char Buff[1024] = {0};
						char BuffDefault[1024] = {0};

						(*IterProp)->GetProperty((BYTE*)this, Buff);

						if ((*IterProp)->GetDefaultValue(BuffDefault)) // check default value skip if necessary
						{
							if (!strcmp(Buff, BuffDefault))
							{
								++IterProp;
								continue;
							}
						}

						if (!(*IterProp)->IsCommonValue()) // common strategy format [Name:Value]
						{
							IterGroup->second += std::string((*IterProp)->GetName()) + ":" + std::string(Buff) + " ";
						}
						else // uninterrupted values purposes (string etc.)
						{
							IterGroup->second += Buff;
						}
					}
					++IterProp;
				}

				//Interface Properties
				const ClassNode::TVecInterfaces &VecInterfaces = pClassNode->GetInterfaceProps();
				ClassNode::TVecInterfaceConstIter IterIntf = VecInterfaces.begin();

				while (IterIntf != VecInterfaces.end())
				{
					ClassNode *pInfClass = CTree.FindInterface((*IterIntf)->strType);

					if (pInfClass)
					{
						const ClassNode::TVecProperties &IntfPropArray = pInfClass->GetProperties();
						ClassNode::TVecPropertyConstIterator &IterPropIntf = IntfPropArray.begin();

						while (IterPropIntf != IntfPropArray.end())
						{
							if ((*IterPropIntf)->IsSerializable() && IterGroup->first == (*IterPropIntf)->GetGroupName())
							{
								char Buff[1024] = {0};
								char BuffDefault[1024] = {0};

								int MemoryOffsetOverride = 0;
								{
									SInterfaceDecl* pIntfDecl = pClassNode->GetInterfaceDecl((*IterPropIntf)->GetClassName());
									if (pIntfDecl){
										MemoryOffsetOverride = pIntfDecl->byteShift;
									}
								}

								(*IterPropIntf)->GetProperty((BYTE*)this + MemoryOffsetOverride, Buff);

								if ((*IterPropIntf)->GetDefaultValue(BuffDefault)) // check default value skip if necessary
								{
									if (!strcmp(Buff, BuffDefault))
									{
										++IterPropIntf;
										continue;
									}
								}

								if (!(*IterPropIntf)->IsCommonValue()) // common strategy format [Name:Value]
								{
									IterGroup->second += std::string((*IterPropIntf)->GetName()) + ":" + std::string(Buff) + " ";
								}
								else // uninterrupted values purposes (string etc.)
								{
									IterGroup->second += Buff;
								}
							}
							++IterPropIntf;
						}
					}
					++IterIntf;
				}
				pClassNode = pClassNode->GetRootNode();
			}
			++IterGroup;
		}

		// write down transient property
		char txt[128] = {'\0'};
		sprintf(txt, " Transient=\"%i\" ", int(IsTransient()));

		OutValue = txt;//" Transient=\"" + boost::lexical_cast<std::string>(int(IsTransient())) + "\" ";

		// put together all data
		IterGroup = ValueMap.begin();
		while (IterGroup != ValueMap.end())
		{
			if (!IterGroup->second.empty())
			{
				OutValue += IterGroup->first + std::string("=\"") + IterGroup->second + std::string("\" ");
			}
			++IterGroup;
		}
	}

	return OutValue;
}
Пример #19
0
void parser_dump(mrb_state *mrb, mrb_ast_node *tree, int offset)
{
#ifdef ENABLE_STDIO
    if (!tree) return;
again:
    dump_prefix(offset);
    node_type n = tree->getType();
    mrb_ast_node *orig = tree;
    if(dynamic_cast<UpdatedNode *>(tree)==0)
        tree = tree->right();

    switch (n) {
        case NODE_BEGIN: parser_dump(mrb,(BeginNode *)orig,offset); break;

        case NODE_RESCUE: parser_dump(mrb,(RescueNode *)orig,offset); break;

        case NODE_ENSURE: parser_dump(mrb,(EnsureNode *)orig,offset); break;

        case NODE_LAMBDA:
            printf("NODE_LAMBDA:\n");
            goto block;

        case NODE_BLOCK:
            printf("NODE_BLOCK:\n");
block:
            parser_dump(mrb,(LambdaCommonNode *)orig,offset);
            break;

        case NODE_IF:
        {
            IfNode *in = (IfNode *)orig;
            printf("NODE_IF:\n");
            dump_prefix(offset+1);
            printf("cond:\n");
            parser_dump(mrb, in->cond(), offset+2); //tree->left()
            dump_prefix(offset+1);
            printf("then:\n");
            parser_dump(mrb, in->true_body(), offset+2); //tree->right()->left()
            if (in->false_body()) {
                dump_prefix(offset+1);
                printf("else:\n");
                parser_dump(mrb, in->false_body() , offset+2); //tree->right()->right()->left()
            }
        }
            break;

        case NODE_AND:
        {
            AndNode *an = (AndNode *)orig;
            printf("NODE_AND:\n");
            parser_dump(mrb, an->lhs(), offset+1);
            parser_dump(mrb, an->rhs(), offset+1);
        }
            break;

        case NODE_OR:
        {
            OrNode *an = (OrNode *)orig;
            printf("NODE_OR:\n");
            parser_dump(mrb, an->lhs(), offset+1);
            parser_dump(mrb, an->rhs(), offset+1);
        }
            break;

        case NODE_CASE:  {
            CaseNode *cn = (CaseNode *)orig;
            printf("NODE_CASE:\n");
            if (cn->switched_on()) {
                parser_dump(mrb, cn->switched_on(), offset+1);
            }
            tree = cn->cases();
            while (tree) {
                dump_prefix(offset+1);
                printf("case:\n");
                dump_recur(mrb, tree->left()->left(), offset+2);
                dump_prefix(offset+1);
                printf("body:\n");
                parser_dump(mrb, tree->left()->right(), offset+2);
                tree = tree->right();
            }
        }
            break;

        case NODE_WHILE:
        {
            WhileNode *n = (WhileNode *)orig;
            printf("NODE_WHILE:\n");
            dump_prefix(offset+1);
            printf("cond:\n");
            parser_dump(mrb, n->lhs(), offset+2);
            dump_prefix(offset+1);
            printf("body:\n");
            parser_dump(mrb, n->rhs(), offset+2);
        }
            break;

        case NODE_UNTIL:
        {
            UntilNode *n = (UntilNode *)orig;
            printf("NODE_UNTIL:\n");
            dump_prefix(offset+1);
            printf("cond:\n");
            parser_dump(mrb, n->lhs(), offset+2);
            dump_prefix(offset+1);
            printf("body:\n");
            parser_dump(mrb, n->rhs(), offset+2);
        }
            break;

        case NODE_FOR:
            printf("NODE_FOR:\n");
            dump_prefix(offset+1);
            parser_dump(mrb,(ForNode *)orig,offset);
            break;

        case NODE_SCOPE:
            printf("NODE_SCOPE:\n");
        {
            ScopeNode *ns = (ScopeNode *)orig;
            const tLocals &n2(ns->locals());

            if ( !n2.empty() ) {
                dump_prefix(offset+1);
                printf("local variables:\n");
                dump_prefix(offset+2);
                for(auto iter=n2.begin(); iter!=n2.end(); ++iter) {
                    if ( (iter+1) != n2.end() )
                        printf(", ");
                    printf("%s", mrb_sym2name(mrb, *iter));
                }
                printf("\n");
            }
            tree = ns->body();
        }
            offset++;
            goto again;

        case NODE_FCALL:
        case NODE_CALL:
        {
            CallCommonNode *cn = (CallCommonNode *)orig;
            printf("NODE_CALL:\n");
            parser_dump(mrb, cn->m_receiver, offset+1);
            dump_prefix(offset+1);
            printf("method='%s' (%d)\n",
                   mrb_sym2name(mrb, cn->m_method),
                   cn->m_method);
            CommandArgs *ca = cn->m_cmd_args;
            if (ca) {
                dump_prefix(offset+1);
                printf("args:\n");
                dump_recur(mrb, ca->m_args, offset+2);
                if (ca->m_blk) {
                    dump_prefix(offset+1);
                    printf("block:\n");
                    parser_dump(mrb, ca->m_blk, offset+2);
                }
            }
        }
            break;

        case NODE_DOT2:
        {
            printf("NODE_DOT2:\n");
            Dot2Node *nd = (Dot2Node *)orig;
            parser_dump(mrb, nd->lhs(), offset+1);
            parser_dump(mrb, nd->rhs(), offset+1);
        }
            break;

        case NODE_DOT3:
        {
            printf("NODE_DOT3:\n");
            Dot3Node *nd = (Dot3Node *)orig;
            parser_dump(mrb, nd->lhs(), offset+1);
            parser_dump(mrb, nd->rhs(), offset+1);
        }
            break;

        case NODE_COLON2:
        {
            Colon2Node *cn = (Colon2Node *)orig;
            printf("NODE_COLON2:\n");
            parser_dump(mrb, cn->m_val, offset+1);
            dump_prefix(offset+1);
            printf("::%s\n", mrb_sym2name(mrb, cn->m_sym));
        }
            break;

        case NODE_COLON3:{
            printf("NODE_COLON3:\n");
            dump_prefix(offset+1);
            Colon3Node *n = (Colon3Node *)orig;
            printf("::%s\n", mrb_sym2name(mrb, n->sym()));
        }
            break;

        case NODE_ARRAY:
            printf("NODE_ARRAY:\n");
            dump_recur(mrb, ((ArrayNode *)orig)->child(), offset+1);
            break;

        case NODE_HASH:
        {
            HashNode *nd = (HashNode *)orig;
            printf("NODE_HASH:\n");
            tree = nd->child();
            while (tree) {
                dump_prefix(offset+1);
                printf("key:\n");
                parser_dump(mrb, tree->left()->left(), offset+2);
                dump_prefix(offset+1);
                printf("value:\n");
                parser_dump(mrb, tree->left()->right(), offset+2);
                tree = tree->right();
            }
        }
            break;

        case NODE_SPLAT:
            printf("NODE_SPLAT:\n");
            parser_dump(mrb, ((SplatNode *)orig)->child(), offset+1);
            break;

        case NODE_ASGN:
        {
            AsgnNode *an = (AsgnNode *)orig;
            printf("NODE_ASGN:\n");
            dump_prefix(offset+1);
            printf("lhs:\n");
            parser_dump(mrb, an->lhs(), offset+2);
            dump_prefix(offset+1);
            printf("rhs:\n");
            parser_dump(mrb, an->rhs(), offset+2);
        }
            break;

        case NODE_MASGN:
        {
            printf("NODE_MASGN:\n");
            dump_prefix(offset+1);
            printf("mlhs:\n");
            MAsgnNode *mn = (MAsgnNode *)orig;
            mrb_ast_node *n2 = mn->lhs();

            if (n2->left()) {
                dump_prefix(offset+2);
                printf("pre:\n");
                dump_recur(mrb, n2->left(), offset+3);
            }
            n2 = n2->right();
            if (n2) {
                if (n2->left()) {
                    dump_prefix(offset+2);
                    printf("rest:\n");
                    if (n2->left() == (mrb_ast_node*)-1) {
                        dump_prefix(offset+2);
                        printf("(empty)\n");
                    }
                    else {
                        parser_dump(mrb, n2->left(), offset+3);
                    }
                }
                n2 = n2->right();
                if (n2) {
                    if (n2->left()) {
                        dump_prefix(offset+2);
                        printf("post:\n");
                        dump_recur(mrb, n2->left(), offset+3);
                    }
                }
            }
            dump_prefix(offset+1);
            printf("rhs:\n");
            parser_dump(mrb, mn->rhs(), offset+2);
        }
            break;

        case NODE_OP_ASGN: {
            OpAsgnNode *opasgn = static_cast<OpAsgnNode *>(tree);
            printf("NODE_OP_ASGN:\n");
            dump_prefix(offset+1);
            printf("lhs:\n");
            parser_dump(mrb, opasgn->lhs(), offset+2);
            dump_prefix(offset+1);
            printf("op='%s' (%d)\n", mrb_sym2name(mrb, opasgn->op_sym), opasgn->op_sym);
            parser_dump(mrb, opasgn->rhs(), offset+1);
            break;
        }
        case NODE_SUPER:
        {
            printf("NODE_SUPER:\n");
            SuperNode *x=(SuperNode *)orig;
            if (x->hasParams()) {
                dump_prefix(offset+1);
                printf("args:\n");
                dump_recur(mrb, x->args(), offset+2);
                if (x->block()) {
                    dump_prefix(offset+1);
                    printf("block:\n");
                    parser_dump(mrb, x->block(), offset+2);
                }
            }
        }
            break;

        case NODE_ZSUPER:
            printf("NODE_ZSUPER\n");
            break;

        case NODE_RETURN:
            printf("NODE_RETURN:\n");
            parser_dump(mrb, ((ReturnNode *)orig)->child(), offset+1);
            break;

        case NODE_YIELD:
            printf("NODE_YIELD:\n");
            dump_recur(mrb, ((YieldNode *)orig)->child(), offset+1);
            break;

        case NODE_BREAK:
            printf("NODE_BREAK:\n");
            parser_dump(mrb, ((BreakNode *)orig)->child(), offset+1);
            //parser_dump(mrb, tree, offset+1);
            break;

        case NODE_NEXT:
            printf("NODE_NEXT:\n");
            parser_dump(mrb, ((NextNode *)orig)->child(), offset+1);
            break;

        case NODE_REDO:
            printf("NODE_REDO\n");
            break;

        case NODE_RETRY:
            printf("NODE_RETRY\n");
            break;

        case NODE_LVAR:
        {
            LVarNode * lvar = (LVarNode *)orig;
            printf("NODE_LVAR %s\n", mrb_sym2name(mrb, lvar->sym()));
        }
            break;

        case NODE_GVAR:
        {
            GVarNode * gvar = (GVarNode *)orig;
            printf("NODE_GVAR %s\n", mrb_sym2name(mrb, gvar->sym()));
        }
            break;

        case NODE_IVAR:
        {
            IVarNode * ivar = (IVarNode *)orig;
            printf("NODE_IVAR %s\n", mrb_sym2name(mrb, ivar->sym()));
        }
            break;

        case NODE_CVAR:
        {
            CVarNode * cvar = (CVarNode *)orig;
            printf("NODE_CVAR %s\n", mrb_sym2name(mrb, cvar->sym()));
        }
            break;

        case NODE_CONST:
        {
            ConstNode * cvar = (ConstNode *)orig;
            printf("NODE_CONST %s\n", mrb_sym2name(mrb, cvar->sym()));
        }

            break;

        case NODE_MATCH:
            printf("NODE_MATCH:\n");
            dump_prefix(offset + 1);
            printf("lhs:\n");
            parser_dump(mrb, tree->left(), offset + 2);
            dump_prefix(offset + 1);
            printf("rhs:\n");
            parser_dump(mrb, tree->right(), offset + 2);
            break;

        case NODE_BACK_REF:
            printf("NODE_BACK_REF: $%c\n", ((BackRefNode *)orig)->m_ref);
            break;

        case NODE_NTH_REF:
            printf("NODE_NTH_REF: $%d\n", ((NthRefNode *)orig)->m_ref);
            break;

        case NODE_ARG:
        {
            ArgNode * var = (ArgNode *)orig;
            printf("NODE_ARG %s\n", mrb_sym2name(mrb, var->sym()));
        }
            break;

        case NODE_BLOCK_ARG:
        {

            printf("NODE_BLOCK_ARG:\n");
            parser_dump(mrb, ((BlockArgNode *)orig)->child(), offset+1);
        }
            break;

        case NODE_INT:
        {
            IntLiteralNode *int_lit = (IntLiteralNode *)orig;
            printf("NODE_INT %s base %d\n", int_lit->m_val, int_lit->m_base);
        }
            break;

        case NODE_FLOAT:
            printf("NODE_FLOAT %s\n", ((FloatLiteralNode *)orig)->m_val);
            break;

        case NODE_NEGATE:
            printf("NODE_NEGATE\n");
            parser_dump(mrb, ((NegateNode *)tree)->child(), offset+1);
            break;

        case NODE_STR:
        {
            StrNode *sn=(StrNode *)orig;
            printf("NODE_STR \"%s\" len %zu\n", sn->m_str, sn->m_length);
        }
            break;

        case NODE_DSTR:
        {
            DstrNode *dn = (DstrNode *)orig;
            printf("NODE_DSTR\n");
            dump_recur(mrb, dn->child(), offset+1);
        }
            break;

        case NODE_XSTR:
            printf("NODE_XSTR \"%s\" len %d\n", (char*)tree->left(), (int)(intptr_t)tree->right());
            break;

        case NODE_DXSTR: {
            DxstrNode *dn = (DxstrNode *)orig;
            printf("NODE_DXSTR\n");
            dump_recur(mrb, dn->child(), offset+1);
        }
            break;

        case NODE_REGX:
            printf("NODE_REGX /%s/%s\n", (char*)tree->left(), (char*)tree->right());
            break;

        case NODE_DREGX:
            printf("NODE_DREGX\n");
            dump_recur(mrb, tree->left(), offset+1);
            dump_prefix(offset);
            printf("tail: %s\n", (char*)tree->right()->right()->left());
            dump_prefix(offset);
            printf("opt: %s\n", (char*)tree->right()->right()->right());
            break;

        case NODE_SYM:
        {
            SymNode * cvar = (SymNode *)orig;
            printf("NODE_SYM :%s\n", mrb_sym2name(mrb, cvar->sym()));
        }
            break;

        case NODE_SELF:
            printf("NODE_SELF\n");
            break;

        case NODE_NIL:
            printf("NODE_NIL\n");
            break;

        case NODE_TRUE:
            printf("NODE_TRUE\n");
            break;

        case NODE_FALSE:
            printf("NODE_FALSE\n");
            break;

        case NODE_ALIAS:
        {
            AliasNode *an = (AliasNode *)orig;
            printf("NODE_ALIAS %s %s:\n",
                   mrb_sym2name(mrb, an->m_from),
                   mrb_sym2name(mrb, an->m_to));
        }
            break;

        case NODE_UNDEF:
            printf("NODE_UNDEF");
        {
            UndefNode *und((UndefNode *)tree);
            for(mrb_sym v : und->m_syms) {
                printf(" %s", mrb_sym2name(mrb, v));
            }
        }
            printf(":\n");
            break;

        case NODE_CLASS: {
            ClassNode *cn = static_cast<ClassNode *>(tree);
            printf("NODE_CLASS:\n");
            if (cn->receiver()->left() == (mrb_ast_node*)0) {
                dump_prefix(offset+1);
                printf(":%s\n", mrb_sym2name(mrb, sym(cn->receiver()->right())));
            }
            else if (cn->receiver()->left() == (mrb_ast_node*)1) {
                dump_prefix(offset+1);
                printf("::%s\n", mrb_sym2name(mrb, sym(cn->receiver()->right())));
            }
            else {
                parser_dump(mrb, cn->receiver()->left(), offset+1);
                dump_prefix(offset+1);
                printf("::%s\n", mrb_sym2name(mrb, sym(cn->receiver()->right())));
            }
            if (cn->super()) {
                dump_prefix(offset+1);
                printf("super:\n");
                parser_dump(mrb, cn->super(), offset+2);
            }
            dump_prefix(offset+1);
            printf("body:\n");
            parser_dump(mrb, cn->scope()->body(), offset+2);
            break;
        }

        case NODE_MODULE: {
            ModuleNode *cn = static_cast<ModuleNode *>(tree);
            printf("NODE_MODULE:\n");

            if (cn->receiver()->left() == (mrb_ast_node*)0) {
                dump_prefix(offset+1);
                printf(":%s\n", mrb_sym2name(mrb, sym(cn->receiver()->right())));
            }
            else if (cn->receiver()->left() == (mrb_ast_node*)1) {
                dump_prefix(offset+1);
                printf("::%s\n", mrb_sym2name(mrb, sym(cn->receiver()->right())));
            }
            else {
                parser_dump(mrb, cn->receiver(), offset+1);
                dump_prefix(offset+1);
                printf("::%s\n", mrb_sym2name(mrb, sym(cn->receiver()->right())));
            }
            dump_prefix(offset+1);
            printf("body:\n");
            parser_dump(mrb, cn->scope()->body(), offset+2);
            break;
        }
        case NODE_SCLASS: {
            printf("NODE_SCLASS:\n");
            SclassNode *scn((SclassNode *)tree);

            parser_dump(mrb, scn->scope(), offset+1);
//            dump_prefix(offset+1);
//            printf("body:\n");
//            parser_dump(mrb, scntree->right()->left()->right(), offset+2);
        }
            break;

        case NODE_DEF:
        {
            DefNode *dn = (DefNode *)orig;
            printf("NODE_DEF:\n");
            dump_prefix(offset+1);
            parser_dump(mrb,dn,offset);
        }
            break;

        case NODE_SDEF:
        {
            SdefNode *sn = (SdefNode *)orig;
            printf("NODE_SDEF:\n");
            parser_dump(mrb, sn->receiver(), offset+1);
            dump_prefix(offset+1);
            printf(":"); // prepend name with ':'
            parser_dump(mrb,sn,offset);
        }
            break;

        case NODE_POSTEXE:
            printf("NODE_POSTEXE:\n");
            parser_dump(mrb, ((PostExeNode *)orig)->child(), offset+1);
            break;

        case NODE_HEREDOC:{
            printf("NODE_HEREDOC:\n");
            HeredocNode *hdn((HeredocNode *)tree);

            parser_dump(mrb, hdn->contents()->doc->left(), offset+1);
        }
            break;

        default:
            printf("node type: %d (0x%x)\n", (int)n, (int)n);
            break;
    }
#endif
}
Пример #20
0
void QsCodeParser::quickifyClass(ClassNode *quickClass)
{
    QString qtClassName = quickClass->name();
    QString bare = quickClass->name();
    if (bare != "Qt" && bare != "Object") {
	if (bare.startsWith("Q")) {
	    bare = bare.mid(1);
	}
        else {
	    qtClassName.prepend("Q");
	    classesWithNoQ.insert(bare);
	}
    }

    ClassNode *qtClass = 0;
    ClassNode *wrapperClass = 0;

    if ((wrapperClass = tryClass("Quick" + bare)) != 0 ||
	 (wrapperClass = tryClass("QS" + bare + "Class")) != 0) {
	qtClass = tryClass(qtClassName);
	if (qtClass == 0) {
	    qtClass = wrapperClass;
	    wrapperClass = 0;
	}
    }
    else if ((wrapperClass = tryClass("Quick" + bare + "Ptr")) != 0) {
	QRegExp ptrToQtType("(Q[A-Za-z0-9_]+)\\s*\\*");
	FunctionNode *ctor =
		wrapperClass->findFunctionNode(wrapperClass->name());
	if (ctor != 0 && !ctor->parameters().isEmpty() &&
	     ptrToQtType.exactMatch(ctor->parameters().first().leftType()))
	    qtClassName = ptrToQtType.cap(1);
	qtClass = tryClass(qtClassName);
    }
    else {
	wrapperClass = tryClass("Q" + bare + "Ptr");
	if (wrapperClass == 0)
	    wrapperClass = tryClass("Quick" + bare + "Interface");
	qtClass = tryClass(qtClassName);
    }

    if (qtClass == 0) {
	if (wrapperClass == 0) {
	    quickClass->location().warning(tr("Cannot find Qt class '%1'")
					    .arg(qtClassName));
	}
        else {
	    quickClass->location().warning(tr("Cannot find Qt class '%1'"
					       " wrapped by '%2'")
					    .arg(qtClassName)
					    .arg(wrapperClass->name()));
	}
	return;
    }

    QList<RelatedClass>::ConstIterator r = qtClass->baseClasses().begin();
    while (r != qtClass->baseClasses().end()) {
	ClassNode *quickBaseClass = cpp2qs.findClassNode(qsTre,
                                                         (*r).node->name());
	if (quickBaseClass)
	    quickClass->addBaseClass((*r).access, quickBaseClass);
	++r;
    }
    if (quickClass->baseClasses().isEmpty() && quickClass->name() != "Object")
	quickClass->addBaseClass(Node::Public,
                                 cpp2qs.findClassNode(qsTre,"Object"));

    QSet<QString> funcBlackList;
    QSet<QString> propertyBlackList;

    NodeList children;
    if (wrapperClass != 0) {
	children = wrapperClass->childNodes();

	funcBlackList.insert(wrapperClass->name());
	funcBlackList.insert("~" + wrapperClass->name());
    }
    children += qtClass->childNodes();

    for (int pass = 0; pass < 2; pass++) {
	NodeList::ConstIterator c = children.begin();
	while (c != children.end()) {
	    if ((*c)->access() != Node::Private &&
		 (*c)->status() == Node::Commendable) {
		if (pass == 0) {
		    if ((*c)->type() == Node::Enum) {
			EnumNode *enume = (EnumNode *) *c;
			quickifyEnum(quickClass, enume);
		    }
                    else if ((*c)->type() == Node::Property) {
			if (!propertyBlackList.contains((*c)->name())) {
			    PropertyNode *property = (PropertyNode *) *c;
			    quickifyProperty(quickClass, qtClass, property);
			    if (!property->getters().isEmpty())
				funcBlackList.insert(property->getters().first()->name());
			    if (!property->setters().isEmpty())
				funcBlackList.insert(property->setters().first()->name());
			    if (!property->resetters().isEmpty())
				funcBlackList.insert(property->resetters().first()->name());
			    propertyBlackList.insert(property->name());
			}
		    }
		}
                else if ((*c)->type() == Node::Function)  {
		    FunctionNode *func = (FunctionNode *) *c;
		    quickifyFunction(quickClass, qtClass, func,
				      funcBlackList.contains((*c)->name()) &&
				      func->parameters().count() < 2);
		}
	    }
	    ++c;
	}
    }
    setQtDoc(quickClass, qtClass->doc());
    classesWithNoQuickDoc.insert(quickClass->name(), quickClass);
}