/[eiffelstudio]/vendor/gobosoft.com/gobo/4.0d/library/tools/src/eiffel/compilation/et_type_checker.e
ViewVC logotype

Diff of /vendor/gobosoft.com/gobo/4.0d/library/tools/src/eiffel/compilation/et_type_checker.e

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 98697 by manus, Sat May 7 16:18:26 2016 UTC revision 98698 by manus, Mon May 9 13:53:54 2016 UTC
# Line 23  inherit Line 23  inherit
23                  undefine                  undefine
24                          make                          make
25                  redefine                  redefine
                         process_bit_feature,  
                         process_bit_n,  
26                          process_class,                          process_class,
27                          process_class_type,                          process_class_type,
28                          process_like_current,                          process_like_current,
# Line 58  feature -- Validity checking Line 56  feature -- Validity checking
56          check_type_validity (a_type: ET_TYPE; a_current_feature_impl: ET_CLOSURE; a_current_class_impl: ET_CLASS; a_current_context: ET_TYPE_CONTEXT)          check_type_validity (a_type: ET_TYPE; a_current_feature_impl: ET_CLOSURE; a_current_class_impl: ET_CLASS; a_current_context: ET_TYPE_CONTEXT)
57                          -- Check validity of `a_type' written in `a_current_feature_impl' in                          -- Check validity of `a_type' written in `a_current_feature_impl' in
58                          -- `a_current_class_impl' viewed from `a_current_context'. Resolve                          -- `a_current_class_impl' viewed from `a_current_context'. Resolve
59                          -- identifiers (such as 'like identifier', 'BIT identifier',                          -- identifiers (such as 'like identifier', 'like {A}.identifier
60                          -- 'like {A}.identifier or 'like a.identifier') in type `a_type'                          -- or 'like a.identifier') in type `a_type' if not already done.
                         -- if not already done.  
61                          -- Set `has_fatal_error' if a fatal error occurred.                          -- Set `has_fatal_error' if a fatal error occurred.
62                  require                  require
63                          a_type_not_void: a_type /= Void                          a_type_not_void: a_type /= Void
# Line 192  feature -- Validity checking Line 189  feature -- Validity checking
189                                                                                          if not has_formal_type_error and a_formal_parameter /= Void then                                                                                          if not has_formal_type_error and a_formal_parameter /= Void then
190                                                                                                  if a_formal_creator = Void or else not a_formal_creator.has_feature (a_creation_procedure) then                                                                                                  if a_formal_creator = Void or else not a_formal_creator.has_feature (a_creation_procedure) then
191                                                                                                          set_fatal_error                                                                                                          set_fatal_error
192                                                                                                          error_handler.report_vtcg4b_error (current_class, current_class_impl, a_position, i, a_name, a_formal_parameter, a_type_class)                                                                                                          if not class_interface_error_only then
193                                                                                                                    error_handler.report_vtcg4b_error (current_class, current_class_impl, a_position, i, a_name, a_formal_parameter, a_type_class)
194                                                                                                            end
195                                                                                                  end                                                                                                  end
196                                                                                          end                                                                                          end
197                                                                                  elseif not a_creation_procedure.is_creation_exported_to (a_type_class, a_base_class) then                                                                                  elseif not a_creation_procedure.is_creation_exported_to (a_type_class, a_base_class) then
# Line 266  feature -- Validity checking Line 265  feature -- Validity checking
265                                                                                                  -- at run-time (we may end up creating instances of deferred classes).                                                                                                  -- at run-time (we may end up creating instances of deferred classes).
266                                                                                          else                                                                                          else
267                                                                                                  set_fatal_error                                                                                                  set_fatal_error
268                                                                                                  error_handler.report_vtcg4a_error (current_class, current_class_impl, a_position, i, a_name, a_base_class, a_type_class)                                                                                                  if not class_interface_error_only then
269                                                                                                            error_handler.report_vtcg4a_error (current_class, current_class_impl, a_position, i, a_name, a_base_class, a_type_class)
270                                                                                                    end
271                                                                                          end                                                                                          end
272                                                                                  end                                                                                  end
273                                                                                  j := j + 1                                                                                  j := j + 1
# Line 350  feature -- Type conversion Line 351  feature -- Type conversion
351    
352  feature {NONE} -- Validity checking  feature {NONE} -- Validity checking
353    
         check_bit_feature_validity (a_type: ET_BIT_FEATURE)  
                         -- Check validity of `a_type'.  
                         -- Resolve identifier in 'BIT identifier' if not already done.  
                         -- Set `has_fatal_error' if a fatal error occurred.  
                 require  
                         a_type_not_void: a_type /= Void  
                         -- no_cycle: no cycle in anchored types involved.  
                 do  
                         has_fatal_error := False  
 -- TODO: should we check whether class BIT is in the universe or not?  
                         if a_type.constant = Void then  
                                         -- Not resolved yet.  
                                 current_class_impl.process (current_system.interface_checker)  
                                 if not current_class_impl.interface_checked or else current_class_impl.has_interface_error then  
                                         set_fatal_error  
                                 elseif attached current_class_impl.named_query (a_type.name) as a_query then  
                                         if attached {ET_CONSTANT_ATTRIBUTE} a_query as a_constant_attribute and then attached {ET_INTEGER_CONSTANT} a_constant_attribute.constant as a_constant then  
                                                 a_type.resolve_identifier_type (a_query.first_seed, a_constant)  
                                                 check_bit_type_validity (a_type)  
                                         else  
                                                         -- VTBT error (ETL2 page 210): The identifier  
                                                         -- in Bit_type must be the final name of a  
                                                         -- constant attribute of type INTEGER.  
                                                 set_fatal_error  
                                                 if current_class = current_class_impl then  
                                                         error_handler.report_vtbt0a_error (current_class, a_type)  
                                                 else  
 -- TODO: this error should have already been reported when processing `current_class_impl'.  
                                                         error_handler.report_vtbt0a_error (current_class_impl, a_type)  
                                                 end  
                                         end  
                                 elseif attached current_class_impl.named_procedure (a_type.name) as a_procedure then  
                                                 -- VTBT error (ETL2 page 210): The identifier  
                                                 -- in Bit_type must be the final name of a  
                                                 -- constant attribute of type INTEGER.  
                                         set_fatal_error  
                                         if current_class = current_class_impl then  
                                                 error_handler.report_vtbt0a_error (current_class, a_type)  
                                         else  
 -- TODO: this error should have already been reported when processing `current_class_impl'.  
                                                 error_handler.report_vtbt0a_error (current_class_impl, a_type)  
                                         end  
                                 else  
                                                 -- VTBT error (ETL2 page 210): The identifier  
                                                 -- in Bit_type must be the final name of a feature.  
                                         set_fatal_error  
                                         if current_class = current_class_impl then  
                                                 error_handler.report_vtbt0b_error (current_class, a_type)  
                                         else  
 -- TODO: this error should have already been reported when processing `current_class_impl'.  
                                                 error_handler.report_vtbt0b_error (current_class_impl, a_type)  
                                         end  
                                 end  
                         end  
                 end  
   
         check_bit_n_validity (a_type: ET_BIT_N)  
                         -- Check validity of `a_type'.  
                         -- Set `has_fatal_error' if a fatal error occurred.  
                 require  
                         a_type_not_void: a_type /= Void  
                         -- no_cycle: no cycle in anchored types involved.  
                 do  
                         has_fatal_error := False  
 -- TODO: should we check whether class BIT is in the universe or not?  
                         -- The validity of the integer constant has  
                         -- already been checked during the parsing.  
                 end  
   
         check_bit_type_validity (a_type: ET_BIT_TYPE)  
                         -- Check validity of the integer constant.  
                         -- Set `has_fatal_error' if a fatal error occurred.  
                 require  
                         a_type_not_void: a_type /= Void  
                         constant_not_void: a_type.constant /= Void  
                         -- no_cycle: no cycle in anchored types involved.  
                 do  
                         has_fatal_error := False  
                         if not attached a_type.constant as l_type_constant then  
                                         -- The precondition says it's attached.  
                                 set_fatal_error  
                                 error_handler.report_giaaa_error  
                         else  
                                 a_type.compute_size  
                                 if a_type.has_size_error then  
                                         set_fatal_error  
                                         if current_class = current_class_impl then  
                                                 error_handler.report_vtbt0c_error (current_class, a_type)  
                                         else  
 -- TODO: this error should have already been reported when processing `current_class_impl'.  
                                                 error_handler.report_vtbt0c_error (current_class_impl, a_type)  
                                         end  
                                 elseif a_type.size = 0 and l_type_constant.is_negative then  
                                                 -- Not considered as a fatal error by gelint.  
                                         if current_class = current_class_impl then  
                                                 error_handler.report_vtbt0d_error (current_class, a_type)  
                                         else  
 -- TODO: this error should have already been reported when processing `current_class_impl'.  
                                                 error_handler.report_vtbt0d_error (current_class_impl, a_type)  
                                         end  
                                 end  
                         end  
                 end  
   
354          check_class_type_validity (a_type: ET_CLASS_TYPE)          check_class_type_validity (a_type: ET_CLASS_TYPE)
355                          -- Check validity of `a_type'.                          -- Check validity of `a_type'.
356                          -- Set `has_fatal_error' if a fatal error occurred.                          -- Set `has_fatal_error' if a fatal error occurred.
# Line 475  feature {NONE} -- Validity checking Line 372  feature {NONE} -- Validity checking
372                          if a_class.is_none then                          if a_class.is_none then
373                                  if a_type.is_generic then                                  if a_type.is_generic then
374                                          set_fatal_error                                          set_fatal_error
375                                          if current_class = current_class_impl then                                          if not class_interface_error_only then
376                                                  error_handler.report_vtug1a_error (current_class, a_type)                                                  if current_class = current_class_impl then
377                                          else                                                          error_handler.report_vtug1a_error (current_class, a_type)
378                                                    else
379  -- TODO: this error should have already been reported when processing `current_class_impl'.  -- TODO: this error should have already been reported when processing `current_class_impl'.
380                                                  error_handler.report_vtug1a_error (current_class_impl, a_type)                                                          error_handler.report_vtug1a_error (current_class_impl, a_type)
381                                                    end
382                                          end                                          end
383                                  end                                  end
384                          elseif a_class.is_unknown then                          elseif a_class.is_unknown then
385                                  set_fatal_error                                  set_fatal_error
386                                  if current_class = current_class_impl then                                  if not class_interface_error_only then
387                                          error_handler.report_vtct0a_error (current_class, a_type)                                          if current_class = current_class_impl then
388                                  else                                                  error_handler.report_vtct0a_error (current_class, a_type)
389                                            else
390  -- TODO: this error should have already been reported when processing `current_class_impl'.  -- TODO: this error should have already been reported when processing `current_class_impl'.
391                                          error_handler.report_vtct0a_error (current_class_impl, a_type)                                                  error_handler.report_vtct0a_error (current_class_impl, a_type)
392                                            end
393                                  end                                  end
394                          else                          else
395                                  a_class.process (current_system.interface_checker)                                  a_class.process (current_system.interface_checker)
# Line 501  feature {NONE} -- Validity checking Line 402  feature {NONE} -- Validity checking
402                                  elseif not a_class.is_generic then                                  elseif not a_class.is_generic then
403                                          if a_type.is_generic then                                          if a_type.is_generic then
404                                                  set_fatal_error                                                  set_fatal_error
405                                                  if current_class = current_class_impl then                                                  if not class_interface_error_only then
406                                                          error_handler.report_vtug1a_error (current_class, a_type)                                                          if current_class = current_class_impl then
407                                                  else                                                                  error_handler.report_vtug1a_error (current_class, a_type)
408                                                            else
409  -- TODO: this error should have already been reported when processing `current_class_impl'.  -- TODO: this error should have already been reported when processing `current_class_impl'.
410                                                          error_handler.report_vtug1a_error (current_class_impl, a_type)                                                                  error_handler.report_vtug1a_error (current_class_impl, a_type)
411                                                            end
412                                                  end                                                  end
413                                          end                                          end
414                                  else                                  else
# Line 515  feature {NONE} -- Validity checking Line 418  feature {NONE} -- Validity checking
418                                          l_actuals := a_type.actual_parameters                                          l_actuals := a_type.actual_parameters
419                                          if not a_type.is_generic then                                          if not a_type.is_generic then
420                                                  set_fatal_error                                                  set_fatal_error
421                                                  if current_class = current_class_impl then                                                  if not class_interface_error_only then
422                                                          error_handler.report_vtug2a_error (current_class, a_type)                                                          if current_class = current_class_impl then
423                                                  else                                                                  error_handler.report_vtug2a_error (current_class, a_type)
424                                                            else
425  -- TODO: this error should have already been reported when processing `current_class_impl'.  -- TODO: this error should have already been reported when processing `current_class_impl'.
426                                                          error_handler.report_vtug2a_error (current_class_impl, a_type)                                                                  error_handler.report_vtug2a_error (current_class_impl, a_type)
427                                                            end
428                                                  end                                                  end
429                                          elseif not attached a_class.formal_parameters as a_formals then                                          elseif not attached a_class.formal_parameters as a_formals then
430                                                          -- Internal error: `a_class' is generic.                                                          -- Internal error: `a_class' is generic.
# Line 532  feature {NONE} -- Validity checking Line 437  feature {NONE} -- Validity checking
437                                          else                                          else
438                                                  if l_actuals.count /= a_formals.count then                                                  if l_actuals.count /= a_formals.count then
439                                                          set_fatal_error                                                          set_fatal_error
440                                                          if current_class = current_class_impl then                                                          if not class_interface_error_only then
441                                                                  error_handler.report_vtug2a_error (current_class, a_type)                                                                  if current_class = current_class_impl then
442                                                          else                                                                          error_handler.report_vtug2a_error (current_class, a_type)
443                                                                    else
444  -- TODO: this error should have already been reported when processing `current_class_impl'.  -- TODO: this error should have already been reported when processing `current_class_impl'.
445                                                                  error_handler.report_vtug2a_error (current_class_impl, a_type)                                                                          error_handler.report_vtug2a_error (current_class_impl, a_type)
446                                                                    end
447                                                          end                                                          end
448                                                  else                                                  else
449                                                          nb := l_actuals.count                                                          nb := l_actuals.count
# Line 572  feature {NONE} -- Validity checking Line 479  feature {NONE} -- Validity checking
479                                                                  if a_formal.is_expanded then                                                                  if a_formal.is_expanded then
480                                                                          if not an_actual.is_type_expanded (current_context) then                                                                          if not an_actual.is_type_expanded (current_context) then
481                                                                                  set_fatal_error                                                                                  set_fatal_error
482                                                                                  error_handler.report_gvtcg5b_error (current_class, current_class_impl, a_type, an_actual, a_formal)                                                                                  if not class_interface_error_only then
483                                                                                            error_handler.report_gvtcg5b_error (current_class, current_class_impl, a_type, an_actual, a_formal)
484                                                                                    end
485                                                                          end                                                                          end
486                                                                  elseif a_formal.is_reference then                                                                  elseif a_formal.is_reference then
487                                                                          if not an_actual.is_type_reference (current_context) then                                                                          if not an_actual.is_type_reference (current_context) then
488                                                                                  set_fatal_error                                                                                  set_fatal_error
489                                                                                  error_handler.report_gvtcg5a_error (current_class, current_class_impl, a_type, an_actual, a_formal)                                                                                  if not class_interface_error_only then
490                                                                                            error_handler.report_gvtcg5a_error (current_class, current_class_impl, a_type, an_actual, a_formal)
491                                                                                    end
492                                                                          end                                                                          end
493                                                                  end                                                                  end
494                                                                  a_constraint := a_formal.constraint                                                                  a_constraint := a_formal.constraint
# Line 637  feature {NONE} -- Validity checking Line 548  feature {NONE} -- Validity checking
548                                                                                  -- In class B the actual generic parameter 'X [A]' does not conform                                                                                  -- In class B the actual generic parameter 'X [A]' does not conform
549                                                                                  -- to its constraint 'X [like Current]'.                                                                                  -- to its constraint 'X [like Current]'.
550                                                                          set_fatal_error                                                                          set_fatal_error
551                                                                          error_handler.report_vtcg3a_error (current_class, current_class_impl, a_type, an_actual, a_constraint)                                                                          if not class_interface_error_only then
552                                                                                    error_handler.report_vtcg3a_error (current_class, current_class_impl, a_type, an_actual, a_constraint)
553                                                                            end
554                                                                  end                                                                  end
555                                                                  i := i + 1                                                                  i := i + 1
556                                                          end                                                          end
# Line 698  feature {NONE} -- Validity checking Line 611  feature {NONE} -- Validity checking
611                                                                                          -- anchored type should not depend on a qualified anchored type.                                                                                          -- anchored type should not depend on a qualified anchored type.
612                                                                                          -- This is a way to avoid cycles in qualified anchored types.                                                                                          -- This is a way to avoid cycles in qualified anchored types.
613                                                                                  set_fatal_error                                                                                  set_fatal_error
614                                                                                  error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)                                                                                  if not class_interface_error_only then
615                                                                                            error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)
616                                                                                    end
617                                                                          end                                                                          end
618                                                                  end                                                                  end
619                                                          end                                                          end
# Line 723  feature {NONE} -- Validity checking Line 638  feature {NONE} -- Validity checking
638                                                                                                                          -- anchored type should not depend on a qualified anchored type.                                                                                                                          -- anchored type should not depend on a qualified anchored type.
639                                                                                                                          -- This is a way to avoid cycles in qualified anchored types.                                                                                                                          -- This is a way to avoid cycles in qualified anchored types.
640                                                                                                                  set_fatal_error                                                                                                                  set_fatal_error
641                                                                                                                  error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)                                                                                                                  if not class_interface_error_only then
642                                                                                                                            error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)
643                                                                                                                    end
644                                                                                                          end                                                                                                          end
645                                                                                                  end                                                                                                  end
646                                                                                          end                                                                                          end
# Line 732  feature {NONE} -- Validity checking Line 649  feature {NONE} -- Validity checking
649                                                                  end                                                                  end
650                                                                  if not resolved then                                                                  if not resolved then
651                                                                          set_fatal_error                                                                          set_fatal_error
652                                                                          error_handler.report_vtat1b_error (current_class, l_feature, a_type)                                                                          if not class_interface_error_only then
653                                                                                    error_handler.report_vtat1b_error (current_class, l_feature, a_type)
654                                                                            end
655                                                                  end                                                                  end
656                                                          else                                                          else
657                                                                          -- 'like argument' not valid in inline agents and invariants.                                                                          -- 'like argument' not valid in inline agents and invariants.
658                                                                  set_fatal_error                                                                  set_fatal_error
659                                                                  error_handler.report_vtat1a_error (current_class, a_type)                                                                  if not class_interface_error_only then
660                                                                            error_handler.report_vtat1a_error (current_class, a_type)
661                                                                    end
662                                                          end                                                          end
663                                                  end                                                  end
664                                          end                                          end
# Line 756  feature {NONE} -- Validity checking Line 677  feature {NONE} -- Validity checking
677                                                                                          -- anchored type should not depend on a qualified anchored type.                                                                                          -- anchored type should not depend on a qualified anchored type.
678                                                                                          -- This is a way to avoid cycles in qualified anchored types.                                                                                          -- This is a way to avoid cycles in qualified anchored types.
679                                                                                  set_fatal_error                                                                                  set_fatal_error
680                                                                                  error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)                                                                                  if not class_interface_error_only then
681                                                                                            error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)
682                                                                                    end
683                                                                          end                                                                          end
684                                                                  end                                                                  end
685                                                          else                                                          else
# Line 780  feature {NONE} -- Validity checking Line 703  feature {NONE} -- Validity checking
703                                                                                  -- anchored type should not depend on a qualified anchored type.                                                                                  -- anchored type should not depend on a qualified anchored type.
704                                                                                  -- This is a way to avoid cycles in qualified anchored types.                                                                                  -- This is a way to avoid cycles in qualified anchored types.
705                                                                          set_fatal_error                                                                          set_fatal_error
706                                                                          error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)                                                                          if not class_interface_error_only then
707                                                                                    error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)
708                                                                            end
709                                                                  end                                                                  end
710                                                          end                                                          end
711                                                  else                                                  else
# Line 842  feature {NONE} -- Validity checking Line 767  feature {NONE} -- Validity checking
767                                                                                          -- anchored type should not depend on a qualified anchored type.                                                                                          -- anchored type should not depend on a qualified anchored type.
768                                                                                          -- This is a way to avoid cycles in qualified anchored types.                                                                                          -- This is a way to avoid cycles in qualified anchored types.
769                                                                                  set_fatal_error                                                                                  set_fatal_error
770                                                                                  error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)                                                                                  if not class_interface_error_only then
771                                                                                            error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)
772                                                                                    end
773                                                                          end                                                                          end
774                                                                  end                                                                  end
775                                                          else                                                          else
776                                                                          -- Error: there is no query with this final name.                                                                          -- Error: there is no query with this final name.
777                                                                  set_fatal_error                                                                  set_fatal_error
778                                                                  error_handler.report_vtat1c_error (current_class, a_type, l_class)                                                                  if not class_interface_error_only then
779                                                                            error_handler.report_vtat1c_error (current_class, a_type, l_class)
780                                                                    end
781                                                          end                                                          end
782                                                  end                                                  end
783                                          end                                          end
# Line 866  feature {NONE} -- Validity checking Line 795  feature {NONE} -- Validity checking
795                                                                                  -- anchored type should not depend on a qualified anchored type.                                                                                  -- anchored type should not depend on a qualified anchored type.
796                                                                                  -- This is a way to avoid cycles in qualified anchored types.                                                                                  -- This is a way to avoid cycles in qualified anchored types.
797                                                                          set_fatal_error                                                                          set_fatal_error
798                                                                          error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)                                                                          if not class_interface_error_only then
799                                                                                    error_handler.report_vtat2b_error (current_class, current_class_impl, a_type)
800                                                                            end
801                                                                  end                                                                  end
802                                                          end                                                          end
803                                                  else                                                  else
# Line 905  feature {NONE} -- Validity checking Line 836  feature {NONE} -- Validity checking
836                          reset_fatal_error (had_error)                          reset_fatal_error (had_error)
837                  end                  end
838    
839    feature -- Error reporting
840    
841            class_interface_error_only: BOOLEAN
842                            -- Should only the errors found when checking class interface (and before) be reported?
843    
844            set_class_interface_error_only (b: BOOLEAN)
845                            -- Set `class_interface_error_only' to `b'.
846                    do
847                            class_interface_error_only := b
848                    ensure
849                            class_interface_error_only_set: class_interface_error_only = b
850                    end
851    
852  feature -- Client/Supplier relationship  feature -- Client/Supplier relationship
853    
854          supplier_handler: detachable ET_SUPPLIER_HANDLER          supplier_handler: detachable ET_SUPPLIER_HANDLER
# Line 937  feature {NONE} -- Client/Supplier relati Line 881  feature {NONE} -- Client/Supplier relati
881    
882  feature {ET_AST_NODE} -- Type processing  feature {ET_AST_NODE} -- Type processing
883    
         process_bit_feature (a_type: ET_BIT_FEATURE)  
                         -- Process `a_type'.  
                 do  
                         check_bit_feature_validity (a_type)  
                 end  
   
         process_bit_n (a_type: ET_BIT_N)  
                         -- Process `a_type'.  
                 do  
                         check_bit_n_validity (a_type)  
                 end  
   
884          process_class (a_type: ET_CLASS)          process_class (a_type: ET_CLASS)
885                          -- Process `a_type'.                          -- Process `a_type'.
886                  do                  do

Legend:
Removed from v.98697  
changed lines
  Added in v.98698

  ViewVC Help
Powered by ViewVC 1.1.23