1*78bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*78bc99aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*78bc99aaSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*78bc99aaSAndrew Rist * distributed with this work for additional information
6*78bc99aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*78bc99aaSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*78bc99aaSAndrew Rist * "License"); you may not use this file except in compliance
9*78bc99aaSAndrew Rist * with the License. You may obtain a copy of the License at
10*78bc99aaSAndrew Rist *
11*78bc99aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*78bc99aaSAndrew Rist *
13*78bc99aaSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*78bc99aaSAndrew Rist * software distributed under the License is distributed on an
15*78bc99aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*78bc99aaSAndrew Rist * KIND, either express or implied. See the License for the
17*78bc99aaSAndrew Rist * specific language governing permissions and limitations
18*78bc99aaSAndrew Rist * under the License.
19*78bc99aaSAndrew Rist *
20*78bc99aaSAndrew Rist *************************************************************/
21cdf0e10cSrcweir
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include <s2_luidl/pe_func2.hxx>
24cdf0e10cSrcweir
25cdf0e10cSrcweir
26cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
27cdf0e10cSrcweir #include <ary/idl/i_function.hxx>
28cdf0e10cSrcweir #include <ary/idl/i_type.hxx>
29cdf0e10cSrcweir #include <ary/idl/i_gate.hxx>
30cdf0e10cSrcweir #include <ary/idl/ip_ce.hxx>
31cdf0e10cSrcweir #include <ary/idl/ip_type.hxx>
32cdf0e10cSrcweir #include <ary/doc/d_oldidldocu.hxx>
33cdf0e10cSrcweir #include <s2_luidl/pe_type2.hxx>
34cdf0e10cSrcweir #include <s2_luidl/pe_vari2.hxx>
35cdf0e10cSrcweir #include <s2_luidl/tk_keyw.hxx>
36cdf0e10cSrcweir #include <s2_luidl/tk_ident.hxx>
37cdf0e10cSrcweir #include <s2_luidl/tk_punct.hxx>
38cdf0e10cSrcweir #include <x_parse2.hxx>
39cdf0e10cSrcweir
40cdf0e10cSrcweir
41cdf0e10cSrcweir namespace csi
42cdf0e10cSrcweir {
43cdf0e10cSrcweir namespace uidl
44cdf0e10cSrcweir {
45cdf0e10cSrcweir
46cdf0e10cSrcweir
PE_Function(const RParent & i_rCurInterface)47cdf0e10cSrcweir PE_Function::PE_Function( const RParent & i_rCurInterface )
48cdf0e10cSrcweir : eState(e_none),
49cdf0e10cSrcweir sData_Name(),
50cdf0e10cSrcweir nData_ReturnType(0),
51cdf0e10cSrcweir bData_Oneway(false),
52cdf0e10cSrcweir pCurFunction(0),
53cdf0e10cSrcweir pCurParent(&i_rCurInterface),
54cdf0e10cSrcweir pPE_Type(0),
55cdf0e10cSrcweir nCurParsedType(0),
56cdf0e10cSrcweir sName(),
57cdf0e10cSrcweir pPE_Variable(0),
58cdf0e10cSrcweir eCurParsedParam_Direction(ary::idl::param_in),
59cdf0e10cSrcweir nCurParsedParam_Type(0),
60cdf0e10cSrcweir sCurParsedParam_Name(),
61cdf0e10cSrcweir bIsForConstructors(false)
62cdf0e10cSrcweir {
63cdf0e10cSrcweir pPE_Type = new PE_Type(nCurParsedType);
64cdf0e10cSrcweir pPE_Variable = new PE_Variable(nCurParsedParam_Type, sCurParsedParam_Name);
65cdf0e10cSrcweir }
66cdf0e10cSrcweir
PE_Function(const RParent & i_rCurService,E_Constructor)67cdf0e10cSrcweir PE_Function::PE_Function( const RParent & i_rCurService,
68cdf0e10cSrcweir E_Constructor )
69cdf0e10cSrcweir : eState(expect_name),
70cdf0e10cSrcweir sData_Name(),
71cdf0e10cSrcweir nData_ReturnType(0),
72cdf0e10cSrcweir bData_Oneway(false),
73cdf0e10cSrcweir pCurFunction(0),
74cdf0e10cSrcweir pCurParent(&i_rCurService),
75cdf0e10cSrcweir pPE_Type(0),
76cdf0e10cSrcweir nCurParsedType(0),
77cdf0e10cSrcweir sName(),
78cdf0e10cSrcweir pPE_Variable(0),
79cdf0e10cSrcweir eCurParsedParam_Direction(ary::idl::param_in),
80cdf0e10cSrcweir nCurParsedParam_Type(0),
81cdf0e10cSrcweir sCurParsedParam_Name(),
82cdf0e10cSrcweir bIsForConstructors(true)
83cdf0e10cSrcweir {
84cdf0e10cSrcweir pPE_Type = new PE_Type(nCurParsedType);
85cdf0e10cSrcweir pPE_Variable = new PE_Variable(nCurParsedParam_Type, sCurParsedParam_Name);
86cdf0e10cSrcweir }
87cdf0e10cSrcweir
88cdf0e10cSrcweir void
EstablishContacts(UnoIDL_PE * io_pParentPE,ary::Repository & io_rRepository,TokenProcessing_Result & o_rResult)89cdf0e10cSrcweir PE_Function::EstablishContacts( UnoIDL_PE * io_pParentPE,
90cdf0e10cSrcweir ary::Repository & io_rRepository,
91cdf0e10cSrcweir TokenProcessing_Result & o_rResult )
92cdf0e10cSrcweir {
93cdf0e10cSrcweir UnoIDL_PE::EstablishContacts(io_pParentPE,io_rRepository,o_rResult);
94cdf0e10cSrcweir pPE_Type->EstablishContacts(this,io_rRepository,o_rResult);
95cdf0e10cSrcweir pPE_Variable->EstablishContacts(this,io_rRepository,o_rResult);
96cdf0e10cSrcweir }
97cdf0e10cSrcweir
~PE_Function()98cdf0e10cSrcweir PE_Function::~PE_Function()
99cdf0e10cSrcweir {
100cdf0e10cSrcweir }
101cdf0e10cSrcweir
102cdf0e10cSrcweir void
ProcessToken(const Token & i_rToken)103cdf0e10cSrcweir PE_Function::ProcessToken( const Token & i_rToken )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir i_rToken.Trigger(*this);
106cdf0e10cSrcweir }
107cdf0e10cSrcweir
108cdf0e10cSrcweir void
Process_Stereotype(const TokStereotype & i_rToken)109cdf0e10cSrcweir PE_Function::Process_Stereotype( const TokStereotype & i_rToken )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir if (eState == e_start)
112cdf0e10cSrcweir {
113cdf0e10cSrcweir switch (i_rToken.Id())
114cdf0e10cSrcweir {
115cdf0e10cSrcweir case TokStereotype::ste_oneway:
116cdf0e10cSrcweir bData_Oneway = true;
117cdf0e10cSrcweir SetResult(done, stay);
118cdf0e10cSrcweir break;
119cdf0e10cSrcweir default:
120cdf0e10cSrcweir OnDefault();
121cdf0e10cSrcweir } // end switch
122cdf0e10cSrcweir }
123cdf0e10cSrcweir else
124cdf0e10cSrcweir OnDefault();
125cdf0e10cSrcweir }
126cdf0e10cSrcweir
127cdf0e10cSrcweir void
Process_Identifier(const TokIdentifier & i_rToken)128cdf0e10cSrcweir PE_Function::Process_Identifier( const TokIdentifier & i_rToken )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir switch (eState)
131cdf0e10cSrcweir {
132cdf0e10cSrcweir case e_start:
133cdf0e10cSrcweir GoIntoReturnType();
134cdf0e10cSrcweir break;
135cdf0e10cSrcweir case expect_name:
136cdf0e10cSrcweir sData_Name = i_rToken.Text();
137cdf0e10cSrcweir SetResult(done,stay);
138cdf0e10cSrcweir eState = expect_params_list;
139cdf0e10cSrcweir
140cdf0e10cSrcweir if (NOT bIsForConstructors)
141cdf0e10cSrcweir {
142cdf0e10cSrcweir pCurFunction = &Gate().Ces().Store_Function(
143cdf0e10cSrcweir *pCurParent,
144cdf0e10cSrcweir sData_Name,
145cdf0e10cSrcweir nData_ReturnType,
146cdf0e10cSrcweir bData_Oneway );
147cdf0e10cSrcweir }
148cdf0e10cSrcweir else
149cdf0e10cSrcweir {
150cdf0e10cSrcweir pCurFunction = &Gate().Ces().Store_ServiceConstructor(
151cdf0e10cSrcweir *pCurParent,
152cdf0e10cSrcweir sData_Name );
153cdf0e10cSrcweir }
154cdf0e10cSrcweir PassDocuAt(*pCurFunction);
155cdf0e10cSrcweir break;
156cdf0e10cSrcweir case expect_parameter_variable:
157cdf0e10cSrcweir GoIntoParameterVariable();
158cdf0e10cSrcweir break;
159cdf0e10cSrcweir case expect_exception:
160cdf0e10cSrcweir GoIntoException();
161cdf0e10cSrcweir break;
162cdf0e10cSrcweir default:
163cdf0e10cSrcweir OnDefault();
164cdf0e10cSrcweir }
165cdf0e10cSrcweir }
166cdf0e10cSrcweir
167cdf0e10cSrcweir void
Process_Punctuation(const TokPunctuation & i_rToken)168cdf0e10cSrcweir PE_Function::Process_Punctuation( const TokPunctuation & i_rToken )
169cdf0e10cSrcweir {
170cdf0e10cSrcweir switch (eState)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir case e_start:
173cdf0e10cSrcweir SetResult(done,stay);
174cdf0e10cSrcweir break;
175cdf0e10cSrcweir case expect_params_list:
176cdf0e10cSrcweir if (i_rToken.Id() != TokPunctuation::BracketOpen)
177cdf0e10cSrcweir {
178cdf0e10cSrcweir OnDefault();
179cdf0e10cSrcweir return;
180cdf0e10cSrcweir }
181cdf0e10cSrcweir SetResult(done,stay);
182cdf0e10cSrcweir eState = expect_parameter;
183cdf0e10cSrcweir break;
184cdf0e10cSrcweir case expect_parameter:
185cdf0e10cSrcweir if (i_rToken.Id() == TokPunctuation::BracketClose)
186cdf0e10cSrcweir {
187cdf0e10cSrcweir SetResult(done,stay);
188cdf0e10cSrcweir eState = params_finished;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir else
191cdf0e10cSrcweir {
192cdf0e10cSrcweir OnDefault();
193cdf0e10cSrcweir return;
194cdf0e10cSrcweir }
195cdf0e10cSrcweir break;
196cdf0e10cSrcweir case expect_parameter_separator:
197cdf0e10cSrcweir if (i_rToken.Id() == TokPunctuation::Comma)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir SetResult(done,stay);
200cdf0e10cSrcweir eState = expect_parameter;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir else if (i_rToken.Id() == TokPunctuation::BracketClose)
203cdf0e10cSrcweir {
204cdf0e10cSrcweir SetResult(done,stay);
205cdf0e10cSrcweir eState = params_finished;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir else
208cdf0e10cSrcweir {
209cdf0e10cSrcweir OnDefault();
210cdf0e10cSrcweir return;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir break;
213cdf0e10cSrcweir case params_finished:
214cdf0e10cSrcweir case exceptions_finished:
215cdf0e10cSrcweir if (i_rToken.Id() != TokPunctuation::Semicolon)
216cdf0e10cSrcweir {
217cdf0e10cSrcweir OnDefault();
218cdf0e10cSrcweir return;
219cdf0e10cSrcweir }
220cdf0e10cSrcweir SetResult(done,pop_success);
221cdf0e10cSrcweir eState = e_none;
222cdf0e10cSrcweir break;
223cdf0e10cSrcweir case expect_exceptions_list:
224cdf0e10cSrcweir if (i_rToken.Id() != TokPunctuation::BracketOpen)
225cdf0e10cSrcweir {
226cdf0e10cSrcweir OnDefault();
227cdf0e10cSrcweir return;
228cdf0e10cSrcweir }
229cdf0e10cSrcweir SetResult(done,stay);
230cdf0e10cSrcweir eState = expect_exception;
231cdf0e10cSrcweir break;
232cdf0e10cSrcweir case expect_exception_separator:
233cdf0e10cSrcweir if (i_rToken.Id() == TokPunctuation::Comma)
234cdf0e10cSrcweir {
235cdf0e10cSrcweir SetResult(done,stay);
236cdf0e10cSrcweir eState = expect_exception;
237cdf0e10cSrcweir }
238cdf0e10cSrcweir else if (i_rToken.Id() == TokPunctuation::BracketClose)
239cdf0e10cSrcweir {
240cdf0e10cSrcweir SetResult(done,stay);
241cdf0e10cSrcweir eState = exceptions_finished;
242cdf0e10cSrcweir }
243cdf0e10cSrcweir else
244cdf0e10cSrcweir {
245cdf0e10cSrcweir OnDefault();
246cdf0e10cSrcweir return;
247cdf0e10cSrcweir }
248cdf0e10cSrcweir break;
249cdf0e10cSrcweir default:
250cdf0e10cSrcweir OnDefault();
251cdf0e10cSrcweir }
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
254cdf0e10cSrcweir void
Process_BuiltInType(const TokBuiltInType & i_rToken)255cdf0e10cSrcweir PE_Function::Process_BuiltInType( const TokBuiltInType & i_rToken )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir switch (eState)
258cdf0e10cSrcweir {
259cdf0e10cSrcweir case e_start:
260cdf0e10cSrcweir GoIntoReturnType();
261cdf0e10cSrcweir break;
262cdf0e10cSrcweir case expect_parameter_variable:
263cdf0e10cSrcweir GoIntoParameterVariable();
264cdf0e10cSrcweir break;
265cdf0e10cSrcweir case expect_parameter_separator:
266cdf0e10cSrcweir if (i_rToken.Id() != TokBuiltInType::bty_ellipse)
267cdf0e10cSrcweir {
268cdf0e10cSrcweir OnDefault();
269cdf0e10cSrcweir }
270cdf0e10cSrcweir else
271cdf0e10cSrcweir {
272cdf0e10cSrcweir pCurFunction->Set_Ellipse();
273cdf0e10cSrcweir SetResult(done,stay);
274cdf0e10cSrcweir // eState stays the same, because we wait for the closing ")" now.
275cdf0e10cSrcweir }
276cdf0e10cSrcweir break;
277cdf0e10cSrcweir case expect_exception:
278cdf0e10cSrcweir GoIntoException();
279cdf0e10cSrcweir break;
280cdf0e10cSrcweir default:
281cdf0e10cSrcweir OnDefault();
282cdf0e10cSrcweir } // end switch
283cdf0e10cSrcweir }
284cdf0e10cSrcweir
285cdf0e10cSrcweir void
Process_ParameterHandling(const TokParameterHandling & i_rToken)286cdf0e10cSrcweir PE_Function::Process_ParameterHandling( const TokParameterHandling & i_rToken )
287cdf0e10cSrcweir {
288cdf0e10cSrcweir if (eState != expect_parameter)
289cdf0e10cSrcweir {
290cdf0e10cSrcweir OnDefault();
291cdf0e10cSrcweir return;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir
294cdf0e10cSrcweir switch (i_rToken.Id())
295cdf0e10cSrcweir {
296cdf0e10cSrcweir case TokParameterHandling::ph_in:
297cdf0e10cSrcweir eCurParsedParam_Direction = ary::idl::param_in;
298cdf0e10cSrcweir break;
299cdf0e10cSrcweir case TokParameterHandling::ph_out:
300cdf0e10cSrcweir eCurParsedParam_Direction = ary::idl::param_out;
301cdf0e10cSrcweir break;
302cdf0e10cSrcweir case TokParameterHandling::ph_inout:
303cdf0e10cSrcweir eCurParsedParam_Direction = ary::idl::param_inout;
304cdf0e10cSrcweir break;
305cdf0e10cSrcweir default:
306cdf0e10cSrcweir csv_assert(false);
307cdf0e10cSrcweir }
308cdf0e10cSrcweir SetResult(done,stay);
309cdf0e10cSrcweir eState = expect_parameter_variable;
310cdf0e10cSrcweir }
311cdf0e10cSrcweir
312cdf0e10cSrcweir void
Process_Raises()313cdf0e10cSrcweir PE_Function::Process_Raises()
314cdf0e10cSrcweir {
315cdf0e10cSrcweir if (eState != params_finished)
316cdf0e10cSrcweir {
317cdf0e10cSrcweir OnDefault();
318cdf0e10cSrcweir return;
319cdf0e10cSrcweir }
320cdf0e10cSrcweir SetResult(done,stay);
321cdf0e10cSrcweir eState = expect_exceptions_list;
322cdf0e10cSrcweir }
323cdf0e10cSrcweir
324cdf0e10cSrcweir void
Process_Default()325cdf0e10cSrcweir PE_Function::Process_Default()
326cdf0e10cSrcweir {
327cdf0e10cSrcweir switch (eState)
328cdf0e10cSrcweir {
329cdf0e10cSrcweir case e_start:
330cdf0e10cSrcweir GoIntoReturnType();
331cdf0e10cSrcweir break;
332cdf0e10cSrcweir case expect_parameter_variable:
333cdf0e10cSrcweir GoIntoParameterVariable();
334cdf0e10cSrcweir break;
335cdf0e10cSrcweir case expect_exception:
336cdf0e10cSrcweir GoIntoException();
337cdf0e10cSrcweir break;
338cdf0e10cSrcweir default:
339cdf0e10cSrcweir OnDefault();
340cdf0e10cSrcweir } // end switch
341cdf0e10cSrcweir }
342cdf0e10cSrcweir
343cdf0e10cSrcweir void
GoIntoReturnType()344cdf0e10cSrcweir PE_Function::GoIntoReturnType()
345cdf0e10cSrcweir {
346cdf0e10cSrcweir SetResult(not_done, push_sure, pPE_Type.Ptr());
347cdf0e10cSrcweir eState = in_return_type;
348cdf0e10cSrcweir }
349cdf0e10cSrcweir
350cdf0e10cSrcweir void
GoIntoParameterVariable()351cdf0e10cSrcweir PE_Function::GoIntoParameterVariable()
352cdf0e10cSrcweir {
353cdf0e10cSrcweir SetResult(not_done, push_sure, pPE_Variable.Ptr());
354cdf0e10cSrcweir eState = in_parameter_variable;
355cdf0e10cSrcweir }
356cdf0e10cSrcweir
357cdf0e10cSrcweir void
GoIntoException()358cdf0e10cSrcweir PE_Function::GoIntoException()
359cdf0e10cSrcweir {
360cdf0e10cSrcweir SetResult(not_done, push_sure, pPE_Type.Ptr());
361cdf0e10cSrcweir eState = in_exception;
362cdf0e10cSrcweir }
363cdf0e10cSrcweir
364cdf0e10cSrcweir void
OnDefault()365cdf0e10cSrcweir PE_Function::OnDefault()
366cdf0e10cSrcweir {
367cdf0e10cSrcweir throw X_AutodocParser(X_AutodocParser::x_Any);
368cdf0e10cSrcweir }
369cdf0e10cSrcweir
370cdf0e10cSrcweir void
InitData()371cdf0e10cSrcweir PE_Function::InitData()
372cdf0e10cSrcweir {
373cdf0e10cSrcweir eState = e_start;
374cdf0e10cSrcweir
375cdf0e10cSrcweir sData_Name.clear();
376cdf0e10cSrcweir nData_ReturnType = 0;
377cdf0e10cSrcweir bData_Oneway = false;
378cdf0e10cSrcweir pCurFunction = 0;
379cdf0e10cSrcweir
380cdf0e10cSrcweir nCurParsedType = 0;
381cdf0e10cSrcweir eCurParsedParam_Direction = ary::idl::param_in;
382cdf0e10cSrcweir nCurParsedParam_Type = 0;
383cdf0e10cSrcweir sCurParsedParam_Name.clear();
384cdf0e10cSrcweir
385cdf0e10cSrcweir if (bIsForConstructors)
386cdf0e10cSrcweir {
387cdf0e10cSrcweir eState = expect_name;
388cdf0e10cSrcweir }
389cdf0e10cSrcweir }
390cdf0e10cSrcweir
391cdf0e10cSrcweir void
ReceiveData()392cdf0e10cSrcweir PE_Function::ReceiveData()
393cdf0e10cSrcweir {
394cdf0e10cSrcweir switch (eState)
395cdf0e10cSrcweir {
396cdf0e10cSrcweir case in_return_type:
397cdf0e10cSrcweir nData_ReturnType = nCurParsedType;
398cdf0e10cSrcweir nCurParsedType = 0;
399cdf0e10cSrcweir eState = expect_name;
400cdf0e10cSrcweir break;
401cdf0e10cSrcweir case in_parameter_variable:
402cdf0e10cSrcweir csv_assert(pCurFunction != 0);
403cdf0e10cSrcweir pCurFunction->Add_Parameter(
404cdf0e10cSrcweir sCurParsedParam_Name,
405cdf0e10cSrcweir nCurParsedParam_Type,
406cdf0e10cSrcweir eCurParsedParam_Direction );
407cdf0e10cSrcweir sCurParsedParam_Name = "";
408cdf0e10cSrcweir nCurParsedParam_Type = 0;
409cdf0e10cSrcweir eCurParsedParam_Direction = ary::idl::param_in;
410cdf0e10cSrcweir eState = expect_parameter_separator;
411cdf0e10cSrcweir break;
412cdf0e10cSrcweir case in_exception:
413cdf0e10cSrcweir csv_assert(pCurFunction != 0);
414cdf0e10cSrcweir pCurFunction->Add_Exception(nCurParsedType);
415cdf0e10cSrcweir eState = expect_exception_separator;
416cdf0e10cSrcweir break;
417cdf0e10cSrcweir default:
418cdf0e10cSrcweir csv_assert(false);
419cdf0e10cSrcweir } // end switch
420cdf0e10cSrcweir }
421cdf0e10cSrcweir
422cdf0e10cSrcweir void
TransferData()423cdf0e10cSrcweir PE_Function::TransferData()
424cdf0e10cSrcweir {
425cdf0e10cSrcweir pCurFunction = 0;
426cdf0e10cSrcweir eState = e_none;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir
429cdf0e10cSrcweir UnoIDL_PE &
MyPE()430cdf0e10cSrcweir PE_Function::MyPE()
431cdf0e10cSrcweir {
432cdf0e10cSrcweir return *this;
433cdf0e10cSrcweir }
434cdf0e10cSrcweir
435cdf0e10cSrcweir
436cdf0e10cSrcweir
437cdf0e10cSrcweir } // namespace uidl
438cdf0e10cSrcweir } // namespace csi
439cdf0e10cSrcweir
440