@startuml

legend center
  Copyright (c) 2014-2016  Thilo Fischer.
  
  This diagram is part of the developer documentation of rocc.
 
  rocc is free software with a multi-license approach: you can
  redistribute it and/or modify it as if it was under the terms of the
  GNU General Public License as long as the things you publish to
  satisfy the GPL's copyleft still can be integrated into the rocc
  project's main codebase without restricting the multi-license
  approach. See LICENSE.txt from the top-level directory for details.
 
  The same license applies to this document.

  --

  The rocc architecture is work in progress.  Deviations of the diagram
  from the actual source code (or vice versa) must be expected.
endlegend

skinparam monochrome true

title Variable Declaration

participant TranslationUnit
participant CompilationContext
participant Token
participant CompilationBranch
participant "a : ArisingSpecification" as ArisingSpecification
participant "s : Variable < Symbol" as Symbol
participant "d : Declaration" as Declaration
participant "a* : ArisingSpecification" as NextArisingSpecification
database "ScopeStack (part of\nCompilationBranch)" as ScopeStack

activate ScopeStack
rnote over ScopeStack : a

... parsed optional storage class, type qualifier, type specifier and parsed identifier ...

[-> Token : pursue_branch

rnote over Token : "";"" or "",""

activate Token

== same as variable definition >> ==

Token -> CompilationBranch : finish_current_scope
activate CompilationBranch

'note over ArisingSpecification : CompilationBranch#\ncurrent_scope
CompilationBranch -> ArisingSpecification : launch
activate ArisingSpecification

ArisingSpecification -> CompilationContext : find_symbols(identifier, namespace,\nsymbol_family, storage_class, type_qualifiers, type_specifiers)
activate CompilationContext
ArisingSpecification <-- CompilationContext : existing_symbols
deactivate CompilationContext

alt existing_symbols.empty?

  create Symbol
  ArisingSpecification -> Symbol : new

  ArisingSpecification -> CompilationContext : announce_symbol(s)
  'activate CompilationContext
  'CompilationBranch <-- CompilationContext : symbol
  'deactivate CompilationContext

else otherwise

  ArisingSpecification -> ArisingSpecification : s = existing_symbols.first
  
end ' alt existing_symbols.empty?

create Declaration
ArisingSpecification -> Declaration : new(s, conditions)

== << same as variable definition ==

ArisingSpecification -> Symbol : announce_declaration(d)
activate Symbol
ArisingSpecification <-- Symbol
deactivate Symbol

CompilationBranch <-- ArisingSpecification : d
deactivate ArisingSpecification

CompilationBranch -> TranslationUnit : announce_semantic_element(d)
activate TranslationUnit
CompilationBranch <-- TranslationUnit
deactivate TranslationUnit

Token <-- CompilationBranch : d
deactivate CompilationBranch

rnote over ScopeStack : a
Token -> CompilationBranch : leave_scope
activate CompilationBranch
Token <-- CompilationBranch : a
deactivate CompilationBranch
deactivate ScopeStack

opt CommaToken
  create NextArisingSpecification
  Token -> NextArisingSpecification : new(a.origin_shared)
  Token -> CompilationBranch : enter_scope(a*)
  rnote over ScopeStack : a*
  activate ScopeStack
end ' alt CommaToken

[<-- Token
deactivate Token
destroy ArisingSpecification

@enduml

