bool FindMethodLocalVariables::VisitDeclRefExpr(DeclRefExpr* e) {
  switch(_state) {
    case LHS: {
//      _os << "#######: DeclRefExpr: " << getVariableName(e) << ", lvalue: " << e->getDecl()->getDeclKindName() << "\n";
      
      //    e->dumpAll();
      ValueDecl* vd = e->getDecl();
      if (vd == NULL)
        break;
      
      QualType q = vd->getType();
      const Type* t = q.getTypePtr();
      
      Decl* d = e->getDecl();
      if (d == NULL)
        break;
      
      string declKind(d->getDeclKindName());
      if ((getDataMembertype(e) == "enum sc_core::sc_time_unit") ||
          (declKind == "CXXMethod"))      {
        break;
      }
      string name = getVariableName(e);
      if ((_inMethodVariables.find(name)) != _inMethodVariables.end()) {
        // Found entry.
        break;
      }
      //      _os << "=> @@@@@@@@@@@@@@@@@@@@@@@@@@@ Insert\n";
      /// Prepare variable information.
      VariableTypeInfo v(_os);
      v._name = getVariableName(e);
      v._expr = e;
      v._isArray = t->isConstantArrayType();
      v._type = getDataMembertype(e);
      if (v._isArray) {
        if (const ConstantArrayType* ca = dyn_cast<ConstantArrayType>(t)) {
          v._arraySize = ca->getSize();
        }
      }
      
      /// Freed in the destructor of VariableTypeInfo.
      FindTemplateTypes te;
      te.Enumerate(t);
      v._tempArgs = te;
//      v.print();
      
      _inMethodVariables.insert(kvType(v._name, v));
      break;
    }
    case RHS: {
      //_os << "\n=> DeclRefExpr\n";
      break;
    }
  };
  
  return true;
}
Exemple #2
0
bool FindSignals::VisitFieldDecl (FieldDecl * fd)
{
//  _os << "####################### FindSignals::VisitFieldDecl\n ";
	QualType
		q = fd->getType ();

	if (IdentifierInfo * info = fd->getIdentifier ())
		{
			//    fname = info->getNameStart();
			//    _os << "\n+ Name: " << info->getNameStart();
//    _os << "\n+ Type: " << q.getAsString();
			//   _os << "\n+ also name: " << fd->getNameAsString();

			/// We are going to store these.  So use pointers.
			const Type *
				tp = q.getTypePtr ();
			FindTemplateTypes *
				te = new FindTemplateTypes ();

			te->Enumerate (tp);
			// te->printTemplateArguments(_os);

			string
				tt = te->getTemplateType ();

//    _os << "OUTPUT ============ " << tt << "\n";
			if ((signed) tt.find ("sc_signal") == -1)
				{
					delete
						te;

					return true;
				}
			SignalContainer *
				sc = new SignalContainer (fd->getNameAsString (), te, fd);

			_signals->insert (FindSignals::
												signalPairType (fd->getNameAsString (), sc));

		}

	return true;
}