Synopsis - Cross-Reference
File: /Synopsis/Parsers/Cxx/ASG.cc1// 2// Copyright (C) 2002 Stephen Davies 3// Copyright (C) 2002 Stefan Seefeld 4// All rights reserved. 5// Licensed to the public under the terms of the GNU LGPL (>= 2), 6// see the file COPYING for details. 7// 8 9#include "STrace.hh" 10#include "ASG.hh" 11#include "Types.hh" 12 13using namespace ASG; 14 15void SourceFile::add_macro_call(char const *name, int l, int s, int e, int o) 16{ 17 Line &line = macro_calls_[l]; 18 line.insert(MacroCall(name, s, e, o)); 19} 20 21int SourceFile::map_column(int l, int col) 22{ 23 Lines::iterator i = macro_calls_.find(l); 24 if (i == macro_calls_.end()) return col; 25 Line &line = i->second; 26 int offset = 0; 27 for (Line::iterator j = line.begin(), end = line.end(); j != end && j->start <= col; ++j) 28 { 29 if (col <= j->end) return -1; 30 offset = j->offset; 31 } 32 return col - offset; 33} 34 35// 36// ASG::Include 37// 38 39Include::Include(SourceFile* target, bool is_macro, bool is_next) 40 : m_target(target), m_is_macro(is_macro), m_is_next(is_next) 41{ } 42 43// 44// ASG::Declaration 45// 46 47Declaration::Declaration(SourceFile* file, int line, const std::string& type, const ScopedName& name) 48 : m_file(file), m_line(line), m_type(type), m_name(name), m_access(Default), m_declared(0) 49{} 50 51Declaration::~Declaration() 52{ } 53 54void 55Declaration::accept(Visitor* visitor) 56{ 57 visitor->visit_declaration(this); 58} 59 60const Types::Declared* 61Declaration::declared() const 62{ 63 if (!m_declared) 64 // Constness of 'this' is preserved through const return type 65 m_declared = new Types::Declared(m_name, const_cast<ASG::Declaration*>(this)); 66 return m_declared; 67} 68 69Types::Declared* 70Declaration::declared() 71{ 72 if (!m_declared) 73 m_declared = new Types::Declared(m_name, this); 74 return m_declared; 75} 76 77// 78// ASG::Builtin 79// 80 81Builtin::Builtin(SourceFile* file, int line, const std::string &type, const ScopedName& name) 82 : Declaration(file, line, type, name) 83{ } 84 85Builtin::~Builtin() 86{ } 87 88void 89Builtin::accept(Visitor* visitor) 90{ 91 visitor->visit_builtin(this); 92} 93 94// 95// ASG::Macro 96// 97 98Macro::Macro(SourceFile* file, int line, const ScopedName& name, Parameters* params, const std::string& text) 99 : Declaration(file, line, "macro", name), 100 m_parameters(params), m_text(text) 101{ } 102 103Macro::~Macro() 104{ } 105 106void 107Macro::accept(Visitor* visitor) 108{ 109 visitor->visit_macro(this); 110} 111 112// 113// ASG::Scope 114// 115 116Scope::Scope(SourceFile* file, int line, const std::string& type, const ScopedName& name) 117 : Declaration(file, line, type, name) 118{ } 119 120Scope::~Scope() 121{} 122 123void 124Scope::accept(Visitor* visitor) 125{ 126 visitor->visit_scope(this); 127} 128 129// 130// ASG::Namespace 131// 132 133Namespace::Namespace(SourceFile* file, int line, const std::string& type, const ScopedName& name) 134 : Scope(file, line, type, name) 135{} 136 137Namespace::~Namespace() 138{} 139 140void 141Namespace::accept(Visitor* visitor) 142{ 143 visitor->visit_namespace(this); 144} 145 146// 147// ASG::Class 148// 149 150Class::Class(SourceFile* file, int line, const std::string& type, const ScopedName& name, 151 bool is_template_specialization) 152 : Scope(file, line, type, name), is_template_specialization_(is_template_specialization) 153{} 154 155Class::~Class() {} 156void Class::accept(Visitor* visitor) { visitor->visit_class(this);} 157 158// 159// ASG::ClassTemplate 160// 161 162ClassTemplate::ClassTemplate(SourceFile* file, int line, const std::string& type, const ScopedName& name, 163 bool is_specialization) 164 : Class(file, line, type, name, is_specialization), 165 template_(0) 166{} 167 168ClassTemplate::~ClassTemplate() {} 169void ClassTemplate::accept(Visitor* visitor) { visitor->visit_class_template(this);} 170 171// 172// ASG::Inheritance 173// 174 175Inheritance::Inheritance(Types::Type* type, const Attributes& attrs) 176 : m_parent(type), m_attrs(attrs) 177{ } 178 179void 180Inheritance::accept(Visitor* visitor) 181{ 182 visitor->visit_inheritance(this); 183} 184 185 186// 187// ASG::Forward 188// 189 190Forward::Forward(SourceFile* file, int line, const std::string& type, const ScopedName& name, 191 bool is_template_specialization) 192 : Declaration(file, line, type, name), template_(0), 193 is_template_specialization_(is_template_specialization) 194{} 195 196void 197Forward::accept(Visitor* visitor) 198{ 199 visitor->visit_forward(this); 200} 201 202 203// 204// ASG::Typedef 205// 206 207Typedef::Typedef(SourceFile* file, int line, const std::string& type, const ScopedName& name, Types::Type* alias, bool constr) 208 : Declaration(file, line, type, name), m_alias(alias), m_constr(constr) 209{ } 210 211Typedef::~Typedef() 212{} 213 214void 215Typedef::accept(Visitor* visitor) 216{ 217 visitor->visit_typedef(this); 218} 219 220 221// 222// ASG::Variable 223// 224 225Variable::Variable(SourceFile* file, int line, const std::string& type, const ScopedName& name, Types::Type* vtype, bool constr) 226 : Declaration(file, line, type, name), m_vtype(vtype), m_constr(constr) 227{ } 228 229Variable::~Variable() 230{} 231 232void 233Variable::accept(Visitor* visitor) 234{ 235 visitor->visit_variable(this); 236} 237 238// 239// ASG::Const 240// 241 242Const::Const(SourceFile* file, int line, const std::string& type, const ScopedName& name, Types::Type* t, const std::string& v) 243 : Declaration(file, line, type, name), m_ctype(t), m_value(v) 244{ } 245 246void 247Const::accept(Visitor* visitor) 248{ 249 visitor->visit_const(this); 250} 251 252 253// 254// ASG::Enum 255// 256 257Enum::Enum(SourceFile* file, int line, const std::string& type, const ScopedName& name) 258 : Declaration(file, line, type, name) 259{ } 260 261Enum::~Enum() 262{} 263 264void 265Enum::accept(Visitor* visitor) 266{ 267 visitor->visit_enum(this); 268} 269 270 271// 272// ASG::Enumerator 273// 274 275Enumerator::Enumerator(SourceFile* file, int line, const std::string& type, const ScopedName& name, const std::string& value) 276 : Declaration(file, line, type, name), m_value(value) 277{ } 278 279void 280Enumerator::accept(Visitor* visitor) 281{ 282 visitor->visit_enumerator(this); 283} 284 285 286// 287// ASG::Function 288// 289 290Function::Function( 291 SourceFile* file, int line, const std::string& type, const ScopedName& name, 292 const Mods& premod, Types::Type* ret, const Mods& postmod, const std::string& realname 293) 294 : Declaration(file, line, type, name), m_pre(premod), m_ret(ret), m_post(postmod), 295 m_realname(realname), m_template(0) 296{} 297 298Function::~Function() 299{} 300 301void 302Function::accept(Visitor* visitor) 303{ 304 visitor->visit_function(this); 305} 306 307 308// 309// ASG::Operation 310// 311 312Operation::Operation( 313 SourceFile* file, int line, const std::string& type, const ScopedName& name, 314 const Mods& premod, Types::Type* ret, const Mods& postmod, const std::string& realname 315) 316 : Function(file, line, type, name, premod, ret, postmod, realname) 317{ } 318 319void 320Operation::accept(Visitor* visitor) 321{ 322 visitor->visit_operation(this); 323} 324 325 326// 327// ASG::Parameter 328// 329 330Parameter::Parameter(const Mods& pre, Types::Type* t, const Mods& post, const std::string& name, const std::string& value) 331 : m_pre(pre), m_post(post), m_type(t), m_name(name), m_value(value) 332{ } 333 334Parameter::~Parameter() 335{} 336 337void 338Parameter::accept(Visitor* visitor) 339{ 340 visitor->visit_parameter(this); 341} 342 343void UsingDirective::accept(Visitor* visitor) 344{ 345 visitor->visit_using_directive(this); 346} 347 348UsingDeclaration::UsingDeclaration(SourceFile* file, int line, ScopedName const& name, Types::Named *d) 349 : Declaration(file, line, "using", name), m_target(d) {} 350 351 352void UsingDeclaration::accept(Visitor* visitor) 353{ 354 visitor->visit_using_declaration(this); 355} 356 357 358Comment::Comment(SourceFile* file, int line, const std::string& text, bool suspect) 359 : m_file(file), m_line(line), m_text(text), m_suspect(suspect) 360{ } 361 362// 363// AST::Visitor 364// 365 366Visitor::~Visitor() 367{} 368void Visitor::visit_declaration(Declaration*) 369{} 370 371void Visitor::visit_builtin(Builtin*) 372{} 373 374void Visitor::visit_macro(Macro* d) 375{ 376 visit_declaration(d); 377} 378void Visitor::visit_scope(Scope* d) 379{ 380 visit_declaration(d); 381} 382void Visitor::visit_namespace(Namespace* d) 383{ 384 visit_scope(d); 385} 386void Visitor::visit_class(Class* d) 387{ 388 visit_scope(d); 389} 390void Visitor::visit_class_template(ClassTemplate* d) 391{ 392 visit_class(d); 393} 394void Visitor::visit_inheritance(Inheritance* d) 395{} 396void Visitor::visit_forward(Forward* d) 397{ 398 visit_declaration(d); 399} 400void Visitor::visit_typedef(Typedef* d) 401{ 402 visit_declaration(d); 403} 404void Visitor::visit_variable(Variable* d) 405{ 406 visit_declaration(d); 407} 408void Visitor::visit_const(Const* d) 409{ 410 visit_declaration(d); 411} 412void Visitor::visit_enum(Enum* d) 413{ 414 visit_declaration(d); 415} 416void Visitor::visit_enumerator(Enumerator* d) 417{ 418 visit_declaration(d); 419} 420void Visitor::visit_function(Function* d) 421{ 422 visit_declaration(d); 423} 424void Visitor::visit_operation(Operation* d) 425{ 426 visit_function(d); 427} 428void Visitor::visit_parameter(Parameter* d) 429{ } 430 431void Visitor::visit_using_directive(UsingDirective* u) 432{ } 433 434void Visitor::visit_using_declaration(UsingDeclaration* u) 435{ } 436 437// vim: set ts=8 sts=4 sw=4 et: